직선 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형태로 다시풀었다. 범위에 유의하자.