0은 지나갈 수 있는 길, 1은 벽인 격자 grid가 주어져요. 왼쪽 위 칸 (0, 0)에서 오른쪽 아래 칸 (행-1, 열-1)까지 상하좌우로만 움직여요.
출발 칸과 도착 칸을 모두 포함해 지나는 칸 수가 가장 적은 경로의 칸 수를 반환해요. 도착할 수 없으면 -1을 반환해요.
BFS는 시작점에서 가까운 칸부터 층층이 퍼지니, 도착 칸에 처음 닿은 순간이 곧 최단이에요.
예시
예시 1
예시 2
제한 사항
- 1 ≤ 행, 열 ≤ 1,000
- 각 칸은 0 또는 1이고, 시작 칸 (0, 0)은 항상 0이에요.
거리 배열을 -1로 채우고 시작 칸을 1로 둬요(칸 수를 세니까요). 큐에서 칸을 꺼내 상하좌우 이웃 중 벽이 아니고 아직 방문하지 않은 칸을
현재 + 1로 표시하며 넣어요. 마지막에 도착 칸의 값을 반환하면 돼요.javascriptCopy codefunction mazeShortest(grid) {const rows = grid.length;const cols = grid[0].length;const DX = [-1, 1, 0, 0];const DY = [0, 0, -1, 1];const dist = Array.from({ length: rows }, () => new Array(cols).fill(-1));const queue = [[0, 0]];let head = 0;dist[0][0] = 1;while (head < queue.length) {const [x, y] = queue[head++];for (let d = 0; d < 4; d++) {const nx = x + DX[d];const ny = y + DY[d];if (nx < 0 || ny < 0 || nx >= rows || ny >= cols) continue;if (grid[nx][ny] === 1 || dist[nx][ny] !== -1) continue;dist[nx][ny] = dist[x][y] + 1;queue.push([nx, ny]);}}return dist[rows - 1][cols - 1];}
예시 테스트만 실행 (Cmd/Ctrl+Enter)
숨김 테스트까지 채점 (Cmd/Ctrl+Shift+Enter)
에디터를 불러오고 있어요…
코드를 작성하고Ctrl↵를 눌러 예시 테스트를 확인해 보세요.