쵼쥬 2021. 10. 17. 20:22


풀이 방법

모든 직선들을 비교해서 교점을 찾아주었다. 교점을 찾아서 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;
    }
}