일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- ios 크로스브라우징
- activeElement
- 로현 청춘의개발
- React Query
- 자바스크립트 호이스팅
- 자바스크립트 논리합 연산자
- 자바스크립트 렉시컬스코프
- refetchOnWindowFocus
- Purdue university
- net::R_SSL_PROTOCOL_ERROR
- EC2 HTTPS로 연결
- touchmove 이벤트
- 퍼듀대학교
- 자바스크립트
- 사파리 가상키보드
- 모두의시간
- 자바스크립트 변수 호이스팅
- but requested an insecure XMLHttpRequest endpoint 'http://~~’. This request has been blocked; the content must be served over HTTPS.
- 자바스크립트 null 병합
- Kafka
- K-SW SQUARE
- 모던 자바스크립트 Deep Dive
- 리액트 가상키보드
- 리액트 쿼리
- 자바스크립트 스코프 체인
- 자바스크립트 중첩함수
- active blur
- 자바스크립트 옵셔널 체이닝
- 자바스
- AWS 로드밸런서
- Today
- Total
개발 여행자, 현
[JavaScript] 프로그래머스 게임 맵 최단거리 (BFS) 본문
[JavaScript] 프로그래머스 게임 맵 최단거리 (BFS)
문제
ROR 게임은 두 팀으로 나누어서 진행하며, 상대 팀 진영을 먼저 파괴하면 이기는 게임입니다. 따라서, 각 팀은 상대 팀 진영에 최대한 빨리 도착하는 것이 유리합니다.
지금부터 당신은 한 팀의 팀원이 되어 게임을 진행하려고 합니다. 다음은 5 x 5 크기의 맵에, 당신의 캐릭터가 (행: 1, 열: 1) 위치에 있고, 상대 팀 진영은 (행: 5, 열: 5) 위치에 있는 경우의 예시입니다.
위 그림에서 검은색 부분은 벽으로 막혀있어 갈 수 없는 길이며, 흰색 부분은 갈 수 있는 길입니다. 캐릭터가 움직일 때는 동, 서, 남, 북 방향으로 한 칸씩 이동하며, 게임 맵을 벗어난 길은 갈 수 없습니다.
아래 예시는 캐릭터가 상대 팀 진영으로 가는 두 가지 방법을 나타내고 있습니다.
- 첫 번째 방법은 11개의 칸을 지나서 상대 팀 진영에 도착했습니다.
- 두 번째 방법은 15개의 칸을 지나서 상대팀 진영에 도착했습니다.
위 예시에서는 첫 번째 방법보다 더 빠르게 상대팀 진영에 도착하는 방법은 없으므로, 이 방법이 상대 팀 진영으로 가는 가장 빠른 방법입니다.
만약, 상대 팀이 자신의 팀 진영 주위에 벽을 세워두었다면 상대 팀 진영에 도착하지 못할 수도 있습니다. 예를 들어, 다음과 같은 경우에 당신의 캐릭터는 상대 팀 진영에 도착할 수 없습니다.
게임 맵의 상태 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) 위치에 있습니다.
문제풀이
해당 문제는 최단 경로 찾기 문제이기에 DFS/BFS 알고리즘 중 BFS를 이용해서 푸는 것이 더 효율적이다.
따라서 BFS 인접행렬을 활용하고자 한다.
function solution(maps) {
// BFS 활용
const row = maps.length - 1,
const col = maps[0].length - 1;
// 큐 - 시작 위치 x, y, 이동 거리
const queue = [[0, 0, 1]];
// 상 하 좌 우
const DIRECTION = [[0, 1], [0, -1], [-1, 0], [1, 0]];
// 사용이 가능한 길인지 확인하는 함수
const isOut = (nextX, nextY, row, col) => nextX < 0 || nextY < 0 || nextX > row || nextY > col;
while(queue.length) {
// 큐 추출
let [x, y, count] = queue.shift();
// 상대 팀 진영이라면
if(x === col && y === row ) return count;
// 동서남북 확인
for(let i = 0; i < 4; i++) {
const [dx, dy] = DIRECTION[i];
// 다음 길 위치
const nextY = dy + y, nextX = dx + x;
// 맵 밖으로 나간다면
if(isOut(nextX, nextY, row, col)) continue;
// 도착한 곳이 벽이라면
if(maps[nextX][nextY] === 0) continue;
// 이미 지난 곳 벽으로 만들어서 다음에 접근 방지
maps[nextX][nextY] = 0;
// 다음에 확인해야하는 곳 큐에 추가
// 갈수 있는 곳이 두 곳이라면 두 곳 추가됨
queue.push([nextX, nextY, count + 1]);
}
}
return -1;
}
'알고리즘' 카테고리의 다른 글
[정렬 알고리즘] 버블정렬 (0) | 2023.04.17 |
---|---|
[정렬 알고리즘] 선택정렬 (0) | 2023.04.17 |
[JavaScript] 프로그래머스 타겟넘버 (DFS, 재귀함수) (0) | 2022.11.14 |
[JavaScript] 너비우선탐색(BFS) 깊이우선탐색(DFS)이란? (0) | 2022.11.06 |
[프로그래머스/JavaScript] K번째 수 (feat. 나의 첫번째 알고리즘 문제) (0) | 2021.10.16 |