교점에 별만들기

Lee1231234·2023년 6월 8일

코딩테스트

목록 보기
63/95

문제

직선 A, B, C에 대한 정보가 담긴 배열 line이 매개변수로 주어집니다. 이때 모든 별을 포함하는 최소 사각형을 return 하도록 solution 함수를 완성해주세요.

제한사항

  • line의 세로(행) 길이는 2 이상 1,000 이하인 자연수입니다.
  • line의 가로(열) 길이는 3입니다.
  • line의 각 원소는 [A, B, C] 형태입니다.
  • A, B, C는 -100,000 이상 100,000 이하인 정수입니다.
  • 무수히 많은 교점이 생기는 직선 쌍은 주어지지 않습니다.
  • A = 0이면서 B = 0인 경우는 주어지지 않습니다.
  • 정답은 1,000 * 1,000 크기 이내에서 표현됩니다.
  • 별이 한 개 이상 그려지는 입력만 주어집니다.
  • 범위에 유의한다면 문제풀이에서 모든걸 알려주기때문에 구현만 하면된다.
    A,B,C의 값이 100,000까지 가기때문에 배열과 int형 범위로는 초과하는 테스트케이스가 존재한다 따라서 long형의 범위까지 확장해야한다.
    또한 교점은 무조건 직선쌍에 하나만 존재하므로 무수히많은 교점 즉 겹치는 line은 존재하지 않는다.

    코드

    import java.util.*;
    class Solution {
        public String[] solution(int[][] line) {
            ArrayList<lines> list = new ArrayList<>();
            long maxX=Long.MIN_VALUE,minX=Long.MAX_VALUE;
            long maxY=Long.MIN_VALUE,minY=Long.MAX_VALUE;
            long x,y;
            
            for(int i=0;i<line.length;i++){
                long a = line[i][0];
                long b = line[i][1];
                long e = line[i][2];
                for(int j=i+1;j<line.length;j++){
                    long c = line[j][0];
                    long d = line[j][1];
                    long f = line[j][2];
                    if(a*d-b*c==0||(b*f-e*d)%(a*d-b*c)!=0||(e*c-a*f)%(a*d-b*c)!=0) continue;
                    x = (b*f-e*d)/(a*d-b*c);
                    y = (e*c-a*f)/(a*d-b*c);
                    maxX=Math.max(maxX,x);
                    minX=Math.min(minX,x);
                    maxY=Math.max(maxY,y);
                    minY=Math.min(minY,y);
                    list.add(new lines(x,y));
                }
            }
            
            String[] answer = new String[(int)(maxY-minY)+1];
            StringBuilder sb= new StringBuilder();
            for(int i=0;i<maxX-minX+1;i++){
                sb.append(".");
            }
            Arrays.fill(answer,sb.toString());
            int px,py;
            for(lines s: list){
                px = (int)(s.x-minX);
                py = (int)(maxY-s.y);
               answer[py] =answer[py].substring(0,px)+'*'+answer[py].substring(px+1);
            }
            
            return answer;
        }
        class lines{
            long x;
            long y;
            lines(long x,long y){
                this.x = x;
                this.y = y;
            }
        }
    }

    처음에 lines를 배열로 풀었더니 값의 초과가 나서 class형태로 다시풀었다. 범위에 유의하자.

    profile
    not null

    0개의 댓글