https://programmers.co.kr/learn/courses/30/lessons/87377
크게 어렵진 않았지만 좌표 변환은 복습할만한것 같아서 써본다.
좌표 변환은 각 좌표에 좌측상단 좌표를 빼준 절대값이 된다.
function solution(line) {
var answer = [];
let intersect = []
// 1. 제공된 공식을 사용하여 정수인 교점들을 구한다.
for (let i = 0; i < line.length - 1; i++){
for (let j = i+1; j < line.length; j++){
let fir = line[i], sec = line[j];
let a = fir[0], b = fir[1], e = fir[2];
let c = sec[0], d = sec[1], f = sec[2];
if (a * d === b * c) continue;
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))
intersect.push([x,y])
}
}
// 2. x의 최소, y의 최대값을 구한다.
let minx = Number.MAX_SAFE_INTEGER,
maxy = Number.MIN_SAFE_INTEGER;
for (let [x, y] of intersect){
if (x < minx) minx = x;
if (y > maxy) maxy = y;
}
// 3. 좌측상단(minx, maxy)을 기준점(0,0) 으로 잡고 각 점을 변환한다.
// 이때 변환법은 각 좌표에 좌측상단 좌표를 빼준 절대값이다.
intersect = intersect.map(([x,y]) => {
return [Math.abs(x - minx), Math.abs(y - maxy)];
})
// 4. 변환한 점들을 기준으로 x,y 의 최대값을 구한다.
let maxx = -1;
maxy = -1;
for (let [x,y] of intersect){
if (x > maxx) maxx = x;
if (y > maxy) maxy = y;
}
// 5. i: 0 ~ maxx, j: 0 ~ maxy 만큼 돌면서 i, j가 교점과 일치한다면 별을 그린다.
for (let y1 = 0; y1 <= maxy; y1++){
let str = '';
for (let x1 = 0; x1 <= maxx; x1++){
let flag = 0;
for (let [x,y] of intersect){
if (x === x1 && y === y1) {
flag = 1;
break;
}
}
if (flag) str += '*';
else str += '.';
}
answer.push(str);
}
return answer;
}