2115. 갤러리 - node.js / javascript

윤상준·2022년 7월 1일
0

BOJ - node.js / javascript

목록 보기
55/55
post-thumbnail

문제

내 코드

let fs = require("fs");
let input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");

function solution(input) {
    const [M, N] = input[0].split(" ").map(Number);
    input = input.slice(1);
    let check = {
        rightDown: Array.from({ length: M }, () => Array(N).fill(0)),
        leftDown: Array.from({ length: M }, () => Array(N).fill(0)),
        upRight: Array.from({ length: M }, () => Array(N).fill(0)),
        downRight: Array.from({ length: M }, () => Array(N).fill(0)),
    };
    let answer = 0;

    function checkWall(row, col) {
        if (input[row + 1][col] === ".") {
            if (input[row][col - 1] === "X" && input[row + 1][col - 1] === "X" && check.leftDown[row][col] === 0) {
                check.leftDown[row][col] = 1;
                check.leftDown[row + 1][col] = 1;
                answer++;
            }

            if (input[row][col + 1] === "X" && input[row + 1][col + 1] === "X" && check.rightDown[row][col] === 0) {
                check.rightDown[row][col] = 1;
                check.rightDown[row + 1][col] = 1;
                answer++;
            }
        }

        if (input[row][col + 1] === ".") {
            if (input[row - 1][col] === "X" && input[row - 1][col + 1] === "X" && check.upRight[row][col] === 0) {
                check.upRight[row][col] = 1;
                check.upRight[row][col + 1] = 1;
                answer++;
            }

            if (input[row + 1][col] === "X" && input[row + 1][col + 1] === "X" && check.downRight[row][col] === 0) {
                check.downRight[row][col] = 1;
                check.downRight[row][col + 1] = 1;
                answer++;
            }
        }
    }

    for (let row = 1; row < M - 1; row++) {
        for (let col = 1; col < N - 1; col++) {
            if (input[row][col] === ".") {
                checkWall(row, col);
            }
        }
    }

    return answer;
}

console.log(solution(input));

깃허브 링크

https://github.com/highjoon/Algorithm/blob/master/BOJ/2115.js

후기

처음 보는 유형이라 당황했던 문제.

이거 보고 좀 더 당황했다.

쉽게 말해서 빈 공간 . 을 만나면 그 칸을 기준으로

  • 위쪽의 두칸
  • 아래쪽의 두칸
  • 왼쪽의 두칸
  • 오른쪽의 두칸

이 벽 X 이면서 비어있으면 거기에 그림을 걸면 된다.

그림을 최대한 많이 거는 법은 그냥 제일 왼쪽에서부터 걸면 되고, 제일 위쪽에서부터 걸면 된다.

그림이 걸려있는지 여부를 확인하기 위해 4개 방향마다 2차원 배열을 선언하고 체크하면서 나간다.

  • upRight : 위쪽에서 두칸 (현재 칸, 그 오른쪽 칸)
  • downRight : 아래쪽에서 두칸 (현재 칸, 그 오른쪽 칸)
  • leftDown : 왼쪽에서 두칸 (현재 칸, 그 아래 칸)
  • rightDown : 오른쪽에서 두칸(현재 칸, 그 아래 칸)

그림을 걸 때마다 answer += 1 해나가면 된다.

profile
하고싶은건 많은데 시간이 없다!

0개의 댓글