최단 거리 => BFS
1. 시작 위치, 레버 위치 찾기
2. 시작부터 레버까지 탐색
3. 레버부터 출구까지 탐색
4. 2 + 3의 결과 리턴
function solution(maps) {
const [row, col] = [maps.length, maps[0].length];
const bfs = (start, dest) => {
let q = [start];
let visited = Array(row)
.fill()
.map(() => Array(col).fill(false));
visited[start[0]][start[1]] = true;
const dy = [-1, 0, 1, 0]; // 위 오 아래 왼
const dx = [0, 1, 0, -1];
while (q.length) {
const [y, x, d] = q.shift();
if (maps[y][x] === dest) return d;
for (let i = 0; i < 4; ++i) {
const ny = y + dy[i];
const nx = x + dx[i];
if (ny < 0 || ny >= row || nx < 0 || nx >= col) continue;
if (maps[ny][nx] === 'X' || visited[ny][nx]) continue;
q.push([ny, nx, d + 1]);
visited[ny][nx] = true;
}
}
return -1;
};
let startPos, leverPos;
for (let i = 0; i < row; ++i) {
for (let j = 0; j < col; ++j) {
if (maps[i][j] === 'S') startPos = [i, j, 0];
if (maps[i][j] === 'L') leverPos = [i, j, 0];
}
if (startPos && leverPos) break;
}
const leverCnt = bfs(startPos, 'L');
const exitCnt = bfs(leverPos, 'E');
if (leverCnt === -1 || exitCnt === -1) return -1;
return leverCnt + exitCnt;
}
처음에 코드 쭉 쓰고 실행했는데 한번에 테스트 케이스를 통과해서 놀랐다.
제출했더니 시간 초과가 나서 디버깅하느라 거의 1시간 걸리긴 했지만 ㅋㅋㅋ
visited 체크할 인덱스를 헷갈렸던 거였는데 찾기가 힘들었다...