난이도 | 풀이 시간 | 시간 제한 | 메모리 제한 |
---|---|---|---|
1.5 | 30분 | 1초 | 128MB |
동빈이는 N x M 크기의 직사각형 형태의 미로에 갇혀 있다. 미로에는 여러 마리의 괴물이 있어 이를 피해 탈출해야 한다. 동빈이의 위치 (1, 1)이고 미로의 출구는 (N, M)의 위치에 존재하여 한 번에 한 칸씩 이동할 수 있다. 이때 괴물이 있는 부분은 0으로, 괴물이 없는 부분은 1로 표시되어 있다. 미로는 반드시 탈출할 수 있는 형태로 제시된다. 이때 동빈이가 탈출하기 위해 움직여야 하는 최소 칸의 개수를 구하시오. 칸을 셀 때는 시작 칸과 마지막 칸을 모두 포함해서 계산한다.
입력
5 6
101010
111111
000001
111111
111111
출력
10
function solution(N, M, maze) {
maze = maze.split('\n').map(m => {
m = m.split('').map(n => Number(n));
return m;
});
// 좌, 우, 상, 하
dx = [-1, 1, 0, 0];
dy = [0, 0, -1, 1];
const queue = [];
let x = 0, y = 0;
queue.push([x, y]);
while (queue.length !== 0) {
const temp = queue.shift();
x = temp[0];
y = temp[1];
for (let i = 0; i < 4; i++) {
const nx = x + dx[i];
const ny = y + dy[i];
if (nx < 0 || ny < 0 || nx >= N || ny >= M) {
continue;
}
if (maze[nx][ny] === 0) {
continue;
}
if (maze[nx][ny] === 1) {
maze[nx][ny] = maze[x][y] + 1;
queue.push([nx, ny]);
}
}
}
console.log(maze[N-1][M-1]);
}
solution(3, 3, '110\n010\n011');
queue를 이용하는 방법에 대해 다시 한 번 익힐 수 있었다. 하지만 아직도 익숙하지 않아 혼자 힘으로 코드를 짜지 못하기 때문에 더 연습을 해야할 것 같다.