1️⃣ 문제 설명

1261번: 알고스팟

스크린샷 2022-09-29 오후 11.09.33.png


2️⃣ 풀이

0은 빈 방, 1은 벽, BFS 활용
(N, M)으로 이동하기위해 부숴야 할 벽의 최소값

1. 구해야 할 것은 단순히 목표까지의 최단 거리가 아님
2. 목표는 확정되어있고, 거기까지 가면서 벽을 최소한으로 부수는 경우를 찾아야 함
3. 숨바꼭질3에서 활용했던 deque를 활용
4. 최대한 빈 방(0)을 우선적으로 고려해야 함
5. 이동하는 방향이 빈 방인 경우, deque의 맨 앞으로 unshift하여 우선 순위를 줌

3️⃣ 나의 코드

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]);
		}
	}
}

4️⃣ 마무리

0을 우선으로 고려해야 한다는 걸 생각해내니 문제는 금방 풀렸다

하지만 계속 런타임 에러가 발생했다…..

스크린샷 2022-09-29 오후 11.22.00.png

예제들로는 정답이 잘 출력되었는데 풀이가 틀렸나해서 검색을 해봐도 내 풀이랑 크게 다른 부분이 없어서 삽질을 하던 중에, 저번 주에 제이미가 런타임 에러가 자꾸 나서 파싱하는 방법을 바꾸니까 해결된 게 떠올라서 나도 위의 코드처럼 하나씩 파싱하도록 바꿔봤다

const [[M, zero, N], ...maze] = require("fs")
	.readFileSync("./dev/stdin")
	.toString()
	.trim()
	.split("\\n")
	.map((v) => v.split("").map(Number));

원래 코드는 이거였는데 아마 첫 배열을 파싱해내는 과정에서 무언가 오류가 나지 않았나 싶다

이번 문제에선 M, N가지고도 헷갈리게 출제했는데 백준은 참 쓸데없는 부분에서 신경쓰이게 만드는 게 많은 것 같다