[프로그래머스] 교점에 별 만들기

Narcoker·2022년 12월 2일
0

코딩테스트

목록 보기
63/150

문제

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(''));
}
profile
열정, 끈기, 집념의 Frontend Developer

0개의 댓글