문제 설명
ROR 게임은 두 팀으로 나누어서 진행하며, 상대 팀 진영을 먼저 파괴하면 이기는 게임입니다. 따라서, 각 팀은 상대 팀 진영에 최대한 빨리 도착하는 것이 유리합니다.
... 중략
게임 맵의 상태 maps가 매개변수로 주어질 때, 캐릭터가 상대 팀 진영에 도착하기 위해서 지나가야 하는 칸의 개수의 최솟값을 return 하도록 solution 함수를 완성해주세요. 단, 상대 팀 진영에 도착할 수 없을 때는 -1을 return 해주세요.
제한사항
- maps는 n x m 크기의 게임 맵의 상태가 들어있는 2차원 배열로, n과 m은 각각 1 이상 100 이하의 자연수입니다.
- n과 m은 서로 같을 수도, 다를 수도 있지만, n과 m이 모두 1인 경우는 입력으로 주어지지 않습니다.
- maps는 0과 1로만 이루어져 있으며, 0은 벽이 있는 자리, 1은 벽이 없는 자리를 나타냅니다.
- 처음에 캐릭터는 게임 맵의 좌측 상단인 (1, 1) 위치에 있으며, 상대방 진영은 게임 맵의 우측 하단인 (n, m) 위치에 있습니다.
class Queue {
constructor() {
this._size = 0;
this.head;
this.tail;
}
get size() {
return this._size;
}
enQueue = (value) => {
const node = { value };
if (this._size === 0) {
this.head = node;
} else {
this.tail.next = node;
}
this.tail = node;
this._size++;
};
deQueue = () => {
if (this._size === 0) return;
const result = this.head.value;
if (this.head.value === this.tail.value) {
this.head = undefined;
this.tail = undefined;
} else {
this.head = this.head.next;
}
this._size--;
return result;
};
}
- 문제를 BFS로 풀기 위해 큐 자료구조를 먼저 만들었다. 자바스크립트에서는 큐 자료구조를 별도로 제공하지 않으므로 직접 만들어야 한다. 만일 array를 shift 한다면 시간복잡도가 n이므로 효율성에 문제가 생길 것이다.
function solution(maps) {
const queue = new Queue();
const dx = [-1, 0, 1, 0];
const dy = [0, 1, 0, -1];
queue.enQueue([0, 0]);
while (queue.size > 0) {
const [x, y] = queue.deQueue();
for (let i = 0; i < 4; i++) {
const nx = x + dx[i];
const ny = y + dy[i];
if (nx < 0 || ny < 0 || nx >= maps.length || ny >= maps[0].length) continue;
if (maps[nx][ny] !== 1) continue;
maps[nx][ny] = maps[x][y] + 1;
queue.enQueue([nx, ny]);
}
}
const answer = maps[maps.length - 1][maps[0].length - 1];
return answer > 1 ? answer : -1;
}
- 0,0 에서 시작해서 n-1, m-1 까지로 출발 좌표와 도착 좌표가 정해져있다. 따라서 0,0 을 큐에 넣고 시작하도록 하였다.
- 사방을 확인하여 그래프를 벗어나면 continue를 하였다. 그리고 1이 아닌 경우도 continue를 해서 생략하였다. 1인 경우만 경로로 인정하였다. 그렇게해서 이동하면 이전 값 + 1 을 진행하였다. 1만 인정하므로 나중에 경로를 돌아서 온 경우는 지름길로 온 경우에 막혀서 중지될 것이다. 즉 가장 빠른 경로로 이동한 경로만이 도착 좌표까지 도착할 수 있다.
- answer에 도착좌표의 값을 담아두었다. 이 값이 0또는 1일 경우 중간에 막혔다는 의미이므로 -1을 반환한다.
참고
'Problem Solving > Programmers' 카테고리의 다른 글
<Level 1> 복서 정렬하기 with JS (0) | 2021.09.08 |
---|---|
<Level 3> 단속 카메라 with JS (0) | 2021.09.02 |
<Level 2> 가장 큰 정사각형 찾기 with JS (1) | 2021.08.31 |
<Level 2> 큰 수 만들기 with JS (0) | 2021.08.27 |
<Level 2> H-index with JS (0) | 2021.08.25 |