본문으로 바로가기

programmers. 기둥과 보 설치

category Algorithm/문제 2021. 5. 6. 14:40

문제

문제

풀이

지문을 잘 이해하고 그대로 구현하면 되는 구현 문제인데..

문제를 잘못 이해한 뒤 풀고 깨닫고 지우고 다시 풀고를 반복하니까 스트레스가 장난 아니었다

x * y의 2차원 배열을 바탕으로 원소 안에 다시 2개의 인덱스를 초기화 해서 총 3차원의 배열을 만들어서 보와 기둥을 표시해도 되고

객체를 만들어도 되고 보와 기둥의 배열을 각각 만들어도 된다

이렇게 초기화 했으면 주어진 값을 돌리면서 해당 조건에 설치하고 삭제하면 끝

코드

    function solution(n, build_frame) {
        var answer = [];
        let pillar = [];
        let beam = [];

        for (let i = 0; i <= n + 1; i++) {
            pillar.push(Array(n + 2).fill(0));
            beam.push(Array(n + 2).fill(0));
        }

        while (build_frame.length) {
            let [x, y, a, b] = build_frame.shift();
            x++;
            y++;

            if (a === 0) {
                if (b === 1) {
                    if (checkP(pillar, beam, [x, y])) {
                        pillar[y][x] = 1;
                    }
                } else {
                    let flag = true;
                    pillar[y][x] = 0;
                    if (pillar[y + 1][x] === 1 && !checkP(pillar, beam, [x, y + 1])) {
                        flag = false;
                    } else if (beam[y + 1][x] && !checkB(pillar, beam, [x, y + 1])) {
                        flag = false;
                    } else if (
                        beam[y + 1][x - 1] &&
                        !checkB(pillar, beam, [x - 1, y + 1])
                    ) {
                        flag = false;
                    }
                    if (!flag) pillar[y][x] = 1;
                }
            } else {
                if (b === 1) {
                    if (checkB(pillar, beam, [x, y])) {
                        beam[y][x] = 1;
                    }
                } else {
                    let flag = true;
                    beam[y][x] = 0;
                    if (pillar[y][x + 1] === 1 && !checkP(pillar, beam, [x + 1, y])) {
                        flag = false;
                    } else if (pillar[y][x] === 1 && !checkP(pillar, beam, [x, y])) {
                        flag = false;
                    } else if (
                        beam[y][x + 1] === 1 &&
                        !checkB(pillar, beam, [x + 1, y])
                    ) {
                        flag = false;
                    } else if (
                        beam[y][x - 1] === 1 &&
                        !checkB(pillar, beam, [x - 1, y])
                    ) {
                        flag = false;
                    }
                    if (!flag) beam[y][x] = 1;
                }
            }
        }

        for (let i = 1; i < n + 2; i++) {
            for (let j = 1; j < n + 2; j++) {
                if (pillar[i][j] === 1) {
                    answer.push([j - 1, i - 1, 0]);
                }
                if (beam[i][j] === 1) {
                    answer.push([j - 1, i - 1, 1]);
                }
            }
        }

        answer.sort((a, b) =>{
            return (a[0]!==b[0]) ? a[0]-b[0] : ((a[1]!==b[1]) ? a[1]-b[1] : a[2]-b[2]);
        });
        return answer;
    }

    function checkP(pillar, beam, frame) {
        let [x, y] = frame;
        if (y === 1) return true;
        if (beam[y][x - 1] === 1) return true;
        if (pillar[y - 1][x] === 1) return true;
        if (beam[y][x] === 1) return true;
        return false;
    }

    function checkB(pillar, beam, frame) {
        let [x, y] = frame;
        if (pillar[y - 1][x] === 1) return true;
        if (pillar[y - 1][x + 1] === 1) return true; 
        if (beam[y][x - 1] === 1 && beam[y][x + 1] === 1) return true; 
        return false;
    }

'Algorithm > 문제' 카테고리의 다른 글

programmers. 외벽 점검  (0) 2021.05.28
baekjoon. 괄호의 값  (0) 2021.05.26
programmers. 광고 삽입  (0) 2021.05.05
programmers. 길 찾기 게임  (0) 2021.05.04
programmers. 합승 택시 요금  (0) 2021.05.02