[백준 2206] 벽 부수고 이동하기 with node.js
📌 문제링크
https://www.acmicpc.net/problem/2206
📌 참조
📌 풀이
- 단순히 좌표만을 큐에 넣어 탐색하는 방식을 넘어, "현재 상태" 자체를 큐에 넣어서 문제를 풀어야 합니다. 즉, 어떤 좌표에 있는가 뿐만 아니라, "여기까지 오면서 벽을 부순 적이 있는가" 여부를 함께 큐에 저장해서 탐색하고, 각각을 별개로 방문체크를 해주어야 한다.
- 참조 보고 힌트를 얻었습니다.
📌 코드
const fs = require('fs');
const stdin = (
process.platform === 'linux'
? fs.readFileSync('/dev/stdin').toString().trim()
: `6 4
0100
1110
1000
0000
0111
0000`
).split('\n');
const input = (() => {
let line = 0;
return () => stdin[line++];
})();
const resetToShortDistance = (isBrokeWall) => {
const shortestDistance = Array.from(new Array(N), () => new Array());
for (let i = 0; i < N; i++) {
for (let j = 0; j < M; j++) {
shortestDistance[i][j] = new Array(2).fill(isBrokeWall);
}
}
return shortestDistance;
};
const getShortestDistance = (startX, startY, isBrokeWall) => {
const shortestDistance = resetToShortDistance(isBrokeWall);
const dx = [0, 0, 1, -1];
const dy = [1, -1, 0, 0];
const queue = [[startX, startY, isBrokeWall]];
let queueCursor = 0;
shortestDistance[startX][startY][isBrokeWall] = 1;
while (queue.length > queueCursor) {
const [x, y, isBrokeWall] = queue[queueCursor++];
if (x === N - 1 && y === M - 1) return shortestDistance[x][y][isBrokeWall];
for (let i = 0; i < 4; i++) {
let nx = x + dx[i];
let ny = y + dy[i];
if (nx < 0 || nx >= N || ny < 0 || ny >= M) continue;
let movementWithoutBrokeWall = !map[nx][ny] && !shortestDistance[nx][ny][isBrokeWall];
if (movementWithoutBrokeWall) {
queue.push([nx, ny, isBrokeWall]);
shortestDistance[nx][ny][isBrokeWall] = shortestDistance[x][y][isBrokeWall] + 1;
}
let movementBrokeWall = map[nx][ny] && !isBrokeWall;
if (movementBrokeWall) {
queue.push([nx, ny, isBrokeWall + 1]);
shortestDistance[nx][ny][isBrokeWall + 1] = shortestDistance[x][y][isBrokeWall] + 1;
}
}
}
return -1;
};
const [N, M] = input().split(' ').map(Number);
const map = Array.from(new Array(N), () => input().split('').map(Number));
console.log(getShortestDistance(0, 0, 0));
Author And Source
이 문제에 관하여([백준 2206] 벽 부수고 이동하기 with node.js), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@hsk10271/백준-2206-벽-부수고-이동하기-with-node.js저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)