개요
게임 맵의 상태 maps가 매개변수로 주어질 때, 캐릭터가 상대 팀 진영에 도착하기 위해서 지나가야 하는 칸의 개수의 최솟값을 return 하도록 solution 함수를 완성해주세요. 단, 상대 팀 진영에 도착할 수 없을 때는 -1을 return 해주세요.
시작지점과 끝점이 정해져있는 미로찾기로 가장 빠른 길을 return하면 된다
풀이
최단거리를 찾는 문제는 보통 BFS를 사용하여 해결한다.
DFS로 어려워보이진 않아서 처음엔 DFS로 구현해봤는데 실행시간 초과, 효율성 테스트에서 하나도 통과하지 못했다.
이후 BFS도 두 가지 방식으로 해결할 수 있는데 하나는 level로 탐색하는 방식과 따로 check 배열을 만들어 그 안에서 자체적으로 레벨을 저장해가면서 해결하는 방법이 있다. 하지만 괜히 효율성 테스트가 신경쓰여 레벨 단위 탐색을 하기로 하였다.
function solution(maps) {
// 경로 최단거리 출력
const dx = [-1, 0, 1, 0];
const dy = [0, 1, 0, -1];
const n = maps.length;
const m = maps[0].length;
let count = 1;
const queue = [[0, 0]];
maps[0][0] = 0;
while (queue.length > 0) {
// 레벨단위 탐색
const len = queue.length;
for (let i = 0; i < len; i++) {
const [x, y] = queue.shift();
for (let j = 0; j < 4; j++) {
const nx = x + dx[j];
const ny = y + dy[j];
if (nx >= 0 && nx < n && ny >= 0 && ny < m && maps[nx][ny] === 1) {
if (nx === n - 1 && ny === m - 1) {
return count + 1;
}
queue.push([nx, ny]);
maps[nx][ny] = 0;
}
}
}
count += 1;
}
return -1;
}
여기서 두 가지 문제가 있었는데 처음엔 maps의 크기를 n * n 크기로 풀어서 문제가 있었고 두 번째는 레벨로 풀기 위해서는 해당 레벨에서의 큐를 전부 비워야하는데 queue의 길이를 따로 선언하지 않고 반복문에 그대로 주는 바람에 배열의 길이가 계속 -1되면서 원하는 답을 구할 수 없었고 조금 삽질을 길게 했다
'알고리즘' 카테고리의 다른 글
[알고리즘] 키패드 누르기 js (0) | 2022.10.29 |
---|---|
[알고리즘] 햄버거 만들기 js (0) | 2022.10.29 |
동적 계획법과 냅색 알고리즘 (0) | 2022.10.28 |
BFS(너비 우선 탐색) (0) | 2022.10.24 |
자주 나오는 정렬 알고리즘 (0) | 2022.10.24 |