





풀이 방법
모든 직선들을 비교해서 교점을 찾아주었다. 교점을 찾아서 list에 넣어줄때 정수로 된 좌표가 아니면 넣지 않고 제거 했다.
교점을 찾을때 그릴 좌표평면의 크기를 찾기 위해 x,y 별로 Max, Min 값을 구해서 크기를 구해주었다.
좌표 평면을 모두 .으로 그리고 찾은 좌표의 값을 * 로 바꿔주었다.
이 문제에서는 정수의 범위를 생각하는 것이 중요하다.
직선 식에 있는 정수들을 -100000 이상 100000 이하이기 때문에 계산하게 되면 최악의 경우 100000 * 100000 이 되서 Long 타입으로 바꿔서 계산해 주었다.
내 코드
import java.awt.*;
import java.io.*;
import java.util.*;
class Solution {
static int minX = Integer.MAX_VALUE;
static int minY = Integer.MAX_VALUE;
static int maxX = Integer.MIN_VALUE;
static int maxY = Integer.MIN_VALUE;
public String[] solution(int[][] line) {
String[] answer;
ArrayList<Point> list = new ArrayList<>();
for (int i = 0; i < line.length; i++) {
for (int j = i + 1; j < line.length; j++) {
Long A = Long.valueOf(line[i][0]);
Long B = Long.valueOf(line[i][1]);
Long C = Long.valueOf(line[j][0]);
Long D = Long.valueOf(line[j][1]);
Long E = Long.valueOf(line[i][2]);
Long F = Long.valueOf(line[j][2]);
Long z = (A * D) - (B * C);
if (z == 0)
continue;
else {
if ((B * F - E * D) % z == 0
&& (E * C - A * F) % z == 0) {
int x = (int) ((B * F - E * D) / z);
int y = (int) ((E * C - A * F) / z);
if(!list.contains(new Point(x,y))){
list.add(new Point(x, y));
if (x < minX)
minX = x;
if (x > maxX)
maxX = x;
if (y < minY)
minY = y;
if (y > maxY)
maxY = y;
}
}
}
}
}
answer = new String[Math.abs(maxY - minY + 1)];
for (int j = 0; j < answer.length; j++) {
String str = "";
for (int i = 0; i < Math.abs(maxX - minX + 1); i++) {
str += ".";
}
answer[j] = str;
}
for (int i = 0; i < list.size(); i++) {
Point point = list.get(i);
answer[maxY - point.y] = answer[maxY - point.y].substring(0, point.x - minX) + "*" + answer[maxY - point.y].substring(point.x - minX + 1);
}
return answer;
}
}
'코딩테스트 > [프로그래머스] 코딩테스트 연습' 카테고리의 다른 글
추석 트래픽 (0) | 2021.10.21 |
---|---|
아이템 줍기 (0) | 2021.10.20 |
뉴스 클러스터링 (0) | 2021.10.08 |
단체 사진 찍기 (0) | 2021.10.08 |
카카오프렌즈 컬러링북 (0) | 2021.10.08 |