[Level2] 게임 맵 최단거리




게임 맵 최단거리

프로그래머스

DFS 로 구하기

function solution(maps) {
  let visited = [];
  let result = [];
  for (let i = 0; i < maps.length; i++) {
    visited.push(new Array(maps[0].length).fill(0));
  }

  let n = maps.length - 1;
  let m = maps[0].length - 1;

  let dx = [1, -1, 0, 0];
  let dy = [0, 0, 1, -1];

  const dfs = (index, x, y, visited) => {
    if (x === n && y === m) {
      result.push(index);
      return;
    }

    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 && visited[nx][ny] === 0 && maps[nx][ny] === 1) {
        visited[x][y] = 1;
        dfs(index + 1, nx, ny, visited);
        visited[x][y] = 0;
      }
    }
  };

  dfs(1, 0, 0, visited);
  return result.length ? Math.min(...result) : -1;
}



BFS 로 구하기

function solution(maps) {
  let visited = [];
  for (let i = 0; i < maps.length; i++) {
    visited.push(new Array(maps[0].length).fill(0));
  }

  let n = maps.length - 1;
  let m = maps[0].length - 1;

  let dx = [1, -1, 0, 0];
  let dy = [0, 0, 1, -1];

  const bfs = (x, y, visited) => {
    let queue = [];
    queue.push([x, y]);
    visited[x][y] = 1;

    while (queue.length) {
      let vertex = queue.shift();
      let row = vertex[0];
      let col = vertex[1];

      for (let i = 0; i < 4; i++) {
        let nx = row + dx[i];
        let ny = col + dy[i];
        if (nx >= 0 && nx <= n && ny >= 0 && ny <= m && visited[nx][ny] === 0 && maps[nx][ny] === 1) {
          visited[nx][ny] = visited[row][col] + 1;
          queue.push([nx, ny]);
        }
      }
    }
  };

  bfs(0, 0, visited);
  return visited[n][m] ? visited[n][m] : -1;
}


초반에 DFS 로 풀었다가 효율성에서 런타임 에러가 났다.
BFS로 풀었더니 해결이 됐다.!

최단 거리를 구할때는 무조건 bfs 를 사용하자
dfs, bfs 템플릿 기억하기