프로그래머스 Lv.2: 교점에 별 만들기

Steve·2021년 11월 15일
0

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;
}
profile
게임과 프론트엔드에 관심이 많습니다.

0개의 댓글