https://school.programmers.co.kr/learn/courses/30/lessons/87377
먼저 답지를 보지 않고 혼자 생각해서 풀었다.👍앞으로도 이렇게 혼자 잘 헤쳐나가도록 하자.
해당 문제의 포인트는
- 범위가 굉장히 크기 때문에 교점의 좌표의 자료형은 Long으로 설정해야한다.
- 구한 교점의 좌표가 정수인지 파악하는 여부
if( (pointX % 1 == 0) && (pointY % 1 == 0) )
- X좌표와 Y좌표가 배열로 표지되었을때는 map[Y][X]가 된다는걸 명심하기.
- String[] -> String은 String.join으로 설정한다.
answer[i] = String.join("", map[i]);
import java.util.*;
class Solution {
ArrayList<Long> listX = new ArrayList<>();
ArrayList<Long> listY = new ArrayList<>();
public String[] solution(int[][] line) {
for(int i = 0; i < line.length; i++){
for(int j = i + 1; j < line.length; j++){
checkLine(line[i][0], line[i][1], line[i][2], line[j][0], line[j][1], line[j][2]);
}
}
long minX = Collections.min(listX);
long maxX = Collections.max(listX);
long minY = Collections.min(listY);
long maxY = Collections.max(listY);
int n = (int)Math.abs(minX - maxX) + 1;
int m = (int)Math.abs(minY - maxY) + 1;
String[][] map = new String[m][n];
for(int i = 0; i < m; i++)
Arrays.fill(map[i], ".");
for(int i = 0; i < listX.size(); i++){
int locateX = (int) Math.abs(minX - listX.get(i));
//int locateY = (int) Math.abs(maxY - listY.get(i));
int locateY = (int) Math.abs(listY.get(i) - maxY);
map[locateY][locateX] = "*";
}
String[] answer = new String[map.length];
for(int i = 0; i < map.length; i++){
answer[i] = String.join("", map[i]);
}
return answer;
}
public void checkLine(long a, long b, long e, int c, int d, int f){
if( (a * d - b * c) == 0 )
return;
double pointX = (double) (b * f - e * d) / (a * d - b * c);
double pointY = (double) (e * c - a * f) / (a * d - b * c);
if( (pointX % 1 == 0) && (pointY % 1 == 0) ){
listX.add((long)pointX);
listY.add((long)pointY);
}
}
}