Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 이분탐색
- 너비우선탐색
- 백준
- 깊이우선탐색
- 프로그래머스
- 해시맵
- HashMap
- Algorithm
- 알고리즘
- broadcast
- 네트워크
- Spring
- 구현
- BFS
- Backtracking
- dynamic programming
- DFS
- DynamicProgramming
- boj
- DP
- 동적계획법
- Network
- 백트래킹
- 브루트포스
- 해시
- switch
- greedy
- 스프링
- programmers
- 그리디
Archives
- Today
- Total
옌의 로그
[Algorithm] 프로그래머스 - 게임 맵 최단거리 본문
문제
사용 알고리즘
- 너비우선탐색 (Breath-First Search)
해결방법
- BFS사용해서 풀면 되는데, 결국 문제에서 구해야 하는 것은 최단 경로로 이동했을 때의 길이이므로, 방문을 체크하는 visited 배열에 길이를 저장해주도록 한다
- 그래프에서 상,하,좌,우 로 이동이 가능하므로 4방향 이동을 간단하게 표현하기 위해 dir 배열을 만들어 사용
- needVisit배열이 BFS의 큐로 보면 되고, 이때 FIFO이므로 while 루프에서 꺼낼 때 shift() 메소드를 사용해 먼저 들어온 것 부터 체크
- 방문하지 않은 지점 (visited배열의 값이 0) 혹은, 이미 방문한 지점이지만 현재 위치에서 한 칸 이동한 것의 길이가 더 최단일 경우 큐(needVisit)에 넣어 다시 탐색
소스코드
사용언어 : javascript
function solution(maps) {
const n = maps.length;
const m = maps[0].length;
return BFS(maps, [0, 0], n, m);
}
const BFS = (graph, start, n, m) => {
const visited = Array.from(Array(n), () => Array(m).fill(0));
const dir = [[-1, 0], [0,1], [1,0], [0, -1]];
let needVisit = []; // 탐색해야할 노드들. Queue로 사용할 배열
needVisit.push(start); // 노드 탐색 시작
visited[start[0]][start[1]] = 1;
while (needVisit.length !== 0) { // 탐색해야할 노드가 남아있다면
const node = needVisit.shift(); // queue이기 때문에 선입선출, shift()를 사용한다.
const [y, x] = [node[0], node[1]];
if (y == (n-1) && x == (m-1)) return visited[y][x];
for (const d of dir) {
const [nY, nX] = [y + d[0], x + d[1]];
if (nY < 0 || nY > n-1 || nX < 0 || nX > m-1) continue;
if (graph[nY][nX] == 0) continue;
// 방문하지 않았거나, 이미 방문했는데 현재 경로(위치)에서 갔을 때가 더 최단거리인 경우
if (visited[nY][nX] == 0 || visited[nY][nX] > visited[y][x] + 1) {
visited[nY][nX] = visited[y][x] + 1;
needVisit.push([nY, nX]);
}
}
}
return -1;
};
2차원 배열
* Array.from(Array(n), () => Array(m).fill(0));
* n X m 배열을 0으로 채움
구조 분해 할당
* https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment
* const [a, b] = [1, 2]
* 우변의 값을 분해하여 좌변의 변수에 각각 할당할 수 있다
한줄평
BFS 오랜만에 풀었는데, 생각보다 쉽게 풀었다. 아직 뇌가 초기화 되지 않았나봄
참고 블로그
'스터디 > 알고리즘' 카테고리의 다른 글
[Algorithm] 백준 - 설탕 배달 (2839번) (0) | 2023.04.03 |
---|---|
[Algorithm] 프로그래머스 - 호텔 대실 (0) | 2023.04.01 |
[Algorithm] 프로그래머스 - N으로 표현 (0) | 2023.03.21 |
[Algorithm] 프로그래머스 - 표 편집 (0) | 2023.03.03 |
[Algorithm] 프로그래머스 - 정수 삼각형 (0) | 2023.02.01 |
Comments