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차원 배열을 선언하고 체크하면서 나간다.
그림을 걸 때마다 answer += 1 해나가면 된다.