Algorithm
프로그래머스 - 게임 맵 최단거리
b._.omi
2023. 5. 30. 13:22

문제



풀이
큐에 x, y의 좌표값과 방문한 칸의 개수 answer을 초기값으로 각각 0, 0, 1씩 넣어준다
큐에 현재 좌표의 상하좌우의 좌표값과 answer+1이 든 배열을 push해준다
shift()로 큐에서 하나씩 빼내서 해당 좌표가 갈 수 없는 길이라면 다음 요소를 확인하고 갈 수 있는 길이라면 큐에 남은 요소가 없어질 때 까지 이 과정을 반복한다
반복하는 과정중 x, y 좌표가 상대 진영에 도달하면 answer을 리턴한다
큐에 남은 요소가 없어진다면 상대 진영에 도착하지 못한다는 의미이기에 -1을 리턴한다
function solution(maps) {
let xLength = maps[0].length;
let yLength = maps.length;
let xGoal = xLength-1;
let yGoal = yLength-1;
let queue = [];
// queue의 초기값으로 y, x 값과 (0, 0)은 방문했기 때문에 리턴할 answer은 1로 둔다
queue.push([0, 0, 1]);
while(queue.length) {
// queue에 있는 요소 꺼내기
let [y, x, answer] = queue.shift();
// x값이 0보다 작거나 xLength보다 길다면 즉, maps에 없는 좌표면 while문 조건식으로 이동
if(x < 0 || x >= xLength) continue;
// y값이 0보다 작거나 yLength보다 길다면 즉, maps에 없는 좌표면 while문 조건식으로 이동
if(y < 0 || y >= yLength) continue;
// maps[y][x]값이 0이라면 즉, 갈 수 없는 길이라면 while문 조건식으로 이동
if(maps[y][x] === 0) continue;
// x와 y값이 상대팀 진영에 도착했다면 answer 리턴
if(x === xGoal && y === yGoal) {
return answer;
}
// 방문한 좌표 0으로 바꿈
maps[y][x] = 0;
// queue에 현재 좌표의 상하좌우 각각의 좌표와 answer+1 푸쉬
queue.push([y+1, x, answer+1]);
queue.push([y, x+1, answer+1]);
queue.push([y-1, x, answer+1]);
queue.push([y, x-1, answer+1]);
}
// while문이 끝났다면 갈 곳이 없다는 의미이므로 -1 리턴
return -1;
}