코딩테스트/프로그래머스
프로그래머스 게임 맵 최단거리
의현
2025. 6. 6. 17:06
링크 : https://school.programmers.co.kr/learn/courses/30/lessons/1844
문제 풀이
dfs로 풀이한 내용 (더보기 -> 효율성 테스트 실패)
더보기
dfs를 이용하여 최단거리를 구할 경우 정답은 되지만 효율성 측면에서 통과를 하지 못한다.
그 이유는 모든 경로를 다 확인하므로 최단거리를 빠르게 구하는 알고리즘 자체는 bfs가 더 효율적
function solution(maps) {
var answer = Infinity;
let dx = [0, 0, 1, -1];
let dy = [1, -1, 0, 0];
let n = maps.length;
let m = maps[0].length;
let visited = Array.from({length: n}, () => Array.from({length: m}, () => 1));
function dfs(x, y, cnt) {
if (answer <= cnt) return;
if (x === m - 1 && y === n - 1) {
answer = Math.min(answer, cnt);
return;
}
for (let i = 0; i < 4; i++) {
let newX = x + dx[i];
let newY = y + dy[i];
if (newX >= 0 && newX < m && newY >= 0 && newY < n && visited[newY][newX] && maps[newY][newX]) {
visited[newY][newX] = 0;
dfs(newX, newY, cnt + 1);
visited[newY][newX] = 1;
}
}
}
visited[0][0] = 0;
dfs(0, 0, 1);
return answer === Infinity ? -1 : answer;
}
dfs를 이용하여 문제를 풀 경우 모든 경로를 검사하므로 최단거리를 찾는데 효율성 측면에서 통과를 하지 못함
bfs는 가장 먼저 도착한 경로가 최단 거리를 나타내므로 모든 경로를 검사할 필요가 없어짐
-> 처음 도착한 것이 최단거리이므로 최악의 경우 시간복잡도가 O(n * m)임
(dfs로 접근할 경우 최악의 경우 O(4^(n * m)) -> 4방향의 n*m만큼 지수적으로 증가함)
function solution(maps) {
let dx = [0, 0, 1, -1];
let dy = [1, -1, 0, 0];
let n = maps.length;
let m = maps[0].length;
let visited = Array.from({length: n}, () => Array.from({length: m}, () => false));
visited[0][0] = true;
maps[0][0] = 0;
let q = [[0, 0, 1]];
while (q.length > 0) {
let [x, y, dist] = q.shift();
if (x === m - 1 && y === n - 1) {
return dist;
}
for (let i = 0; i < 4; i++) {
const newX = x + dx[i];
const newY = y + dy[i];
if (newX >= 0 && newX < m &&
newY >= 0 && newY < n &&
maps[newY][newX] &&
!visited[newY][newX]) {
visited[newY][newX] = true;
q.push([newX, newY, dist + 1]);
}
}
}
return -1;
}
결론
최단거리 찾는 문제는 dfs보단 bfs가 더 좋을 수 있다는 것을 생각하기 -> 모든 경로를 파악하지 않으니까