[프로그래머스] 미로 탈출 (JS)

hhkim·2023년 11월 7일
0

Algorithm - JavaScript

목록 보기
175/188
post-thumbnail

풀이 과정

최단 거리 => 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 체크할 인덱스를 헷갈렸던 거였는데 찾기가 힘들었다...

0개의 댓글