https://school.programmers.co.kr/learn/courses/30/lessons/87377
교점을 구하는 공식은 문제에서 주어졌기에 getDot() 함수로
모든 선분의 교점을 구한다.
교점을 구하고 만약 x값 y값이 모두 정수이면
xDots, yDots에 저장한다.x 좌표, y 좌표의 최대/최소 값을 구한다.
그리고 출력할 2차원 배열 board을 만든다.
각 좌표의 길이는 최대 값 - 최소 값 + 1(원점) 이다.원점좌표계 값을 board용 숫자로 바꾸는 과정은 다음과 같다.
[xMin, yMax] 점이 board에서는 [0,0]
이 되기 때문에
원점 자표계 x, y 값에서 xMin, yMax를 빼준다.
[x - xMin, y - yMax]
그리고 원점 좌표계의 x는 board(배열) 좌표계에서 y 값이고
원점좌표계의 y는 board(배열) 좌표계에서 x 값이므로
x,y 의 자리를 바꿔준다.
[y - yMax, x - xMin]
그리고 현재 x좌표는 반비례 하므로 -1 을 곱해준다.
최종 값은[yMax - y, x - xMin]
이다이 식을 배열에 적용해서 교점 값을 * 로 재할당하고 출력한다.
function solution(line) {
function getDot(data1, data2) {
let [A, B, E] = [data1[0], data1[1], data1[2]];
let [C, D, F] = [data2[0], data2[1], data2[2]];
let x = (B * F - E * D) / (A * D - B * C);
let y = (E * C - A * F) / (A * D - B * C);
if (Number.isInteger(x) && Number.isInteger(y)) {
xDots.push(x);
yDots.push(y);
}
}
let xDots = [];
let yDots = [];
for (let i = 0; i < line.length - 1; i++) {
for (let k = i + 1; k < line.length; k++) {
getDot(line[i], line[k]);
}
}
let [xMax, xMin] = [Math.max(...xDots), Math.min(...xDots)];
let [yMax, yMin] = [Math.max(...yDots), Math.min(...yDots)];
let board = Array.from(Array(yMax - yMin + 1), () => Array(xMax - xMin + 1).fill('.'));
for (let i = 0; i < xDots.length; i++) {
board[yMax - yDots[i]][xDots[i] - xMin] = '*';
}
return board.map((x) => x.join(''));
}