0은 빈 방, 1은 벽, BFS 활용
(N, M)으로 이동하기위해 부숴야 할 벽의 최소값
1. 구해야 할 것은 단순히 목표까지의 최단 거리가 아님
2. 목표는 확정되어있고, 거기까지 가면서 벽을 최소한으로 부수는 경우를 찾아야 함
3. 숨바꼭질3에서 활용했던 deque를 활용
4. 최대한 빈 방(0)을 우선적으로 고려해야 함
5. 이동하는 방향이 빈 방인 경우, deque의 맨 앞으로 unshift하여 우선 순위를 줌
const input = require("fs").readFileSync("./dev/stdin").toString().trim().split("\\n");
const [M, N] = input[0].split(" ").map(Number);
const maze = input.slice(1).map((v) => v.split("").map(Number));
const visited = new Array(N).fill(0).map(() => new Array(M).fill(0));
const d = [
[-1, 0],
[0, 1],
[1, 0],
[0, -1],
];
let flag = true;
const deque = [];
deque.push([0, 0, 0]);
visited[0][0] = 1;
while (flag) {
const [i, j, count] = deque.shift();
if (i === N - 1 && j === M - 1) {
console.log(count);
flag = false;
break;
}
for ([di, dj] of d) {
const [ni, nj] = [i + di, j + dj];
if (ni < 0 || nj < 0 || ni >= N || nj >= M) continue;
if (!visited[ni][nj] && maze[ni][nj] === 0) {
visited[ni][nj] = 1;
deque.unshift([ni, nj, count]);
}
if (!visited[ni][nj] && maze[ni][nj] === 1) {
visited[ni][nj] = 1;
deque.push([ni, nj, count + 1]);
}
}
}
0을 우선으로 고려해야 한다는 걸 생각해내니 문제는 금방 풀렸다
하지만 계속 런타임 에러가 발생했다…..
예제들로는 정답이 잘 출력되었는데 풀이가 틀렸나해서 검색을 해봐도 내 풀이랑 크게 다른 부분이 없어서 삽질을 하던 중에, 저번 주에 제이미가 런타임 에러가 자꾸 나서 파싱하는 방법을 바꾸니까 해결된 게 떠올라서 나도 위의 코드처럼 하나씩 파싱하도록 바꿔봤다
const [[M, zero, N], ...maze] = require("fs")
.readFileSync("./dev/stdin")
.toString()
.trim()
.split("\\n")
.map((v) => v.split("").map(Number));
원래 코드는 이거였는데 아마 첫 배열을 파싱해내는 과정에서 무언가 오류가 나지 않았나 싶다
이번 문제에선 M, N가지고도 헷갈리게 출제했는데 백준은 참 쓸데없는 부분에서 신경쓰이게 만드는 게 많은 것 같다