BFS
BFS란?
- Breadth-First Search
- 너비 우선 탐색, 시작 노드에서 가까운 노드부터 차례대로 탐색하는 알고리즘
Queue 자료구조를 활용
BFS의 사용 목적
- 최단 거리 탐색
- 그래프에서 시작 노드와 도착 노드의 최소 이동 회수, 최단 경로 길이를 구할 때 사용
- 트리의 레벨 탐색
- 트리 구조에서 각 레벨별로 탐색이 필요할 때 사용
- 순차적 확장 탐색
- 시간, 단계, 거리 등 순서를 기준으로 범위를 넓혀가며 탐색
BFS 코드 문제
- 5 × 5 크기의 2차원 배열이 존재
- 각 칸의 값은 다음을 의미
1: 지나갈 수 있는 길0: 지나갈 수 없는 길 (벽)
- 시작 위치는
(0, 0), 도착 위치는(4, 4), 도달이 불가할 경우 "IMPOSSIBLE" 출력 - 목표:
array[4][4]에 도달할 수 있는 최단 거리를 구하기
let maps = [
[1, 0, 1, 1, 1],
[1, 0, 1, 0, 1],
[1, 0, 1, 1, 1],
[1, 1, 1, 0, 1],
[0, 0, 0, 0, 1],
];
let [x_end, y_end] = [maps.length - 1, maps[0].length - 1];
let dx = [1, 0, -1, 0];
let dy = [0, 1, 0, -1];
let queue = [[0, 0]];
while (queue.length !== 0) {
let [dot_x, dot_y] = queue.shift();
for (let i = 0; i < dx.length; i++) {
let x = dx[i] + dot_x;
let y = dy[i] + dot_y;
if (x > x_end || x < 0 || y > y_end || y < 0) continue;
if (maps[x][y] !== 1) continue;
queue.push([x, y]);
maps[x][y] += maps[dot_x][dot_y];
}
}
console.log(maps[x_end][y_end] !== 1 ? maps[x_end][y_end] : "IMPOSSIBLE");
note
dx, dy와 같은 경우, 다음 탐색할 배열의 위치 값을 미리 좌표별로 저장해둔다.
queue를 통해 해당 탐색 위치에서 다음 탐색이 가능한 위치들을 저장해 나간다.
초기 위치는 (0, 0)이기 때문에, 이 값을 먼저 queue에 넣어둔다.
while문을 통해 queue가 빌 때까지 탐색한다. 즉, 더 이상 다음 탐색 경로가 없을 경우 멈춘다.
queue에 저장된 위치값들을 하나씩 꺼내면서, 앞서 선언한 dx, dy를 이용해 아래, 오른쪽, 위, 왼쪽 순으로 탐색을 진행한다.
조건문을 통해 다음 탐색할 배열의 위치에 대한 예외 처리를 해준다.
즉, 배열 인덱스가 유효하지 않거나, 원하지 않는 조건일 경우 해당 방향은 건너뛴다.
// 출력
[
[3, 0, 9, 10, 11],
[2, 0, 8, 0, 10],
[3, 0, 7, 8, 9],
[4, 5, 6, 0, 10],
[0, 0, 0, 0, 11],
];
위 배열은 BFS 탐색이 끝난 후의 maps 배열이며, 각 숫자는 시작점에서 해당 위치까지 도달하는 데 걸린 최단 누적 거리 값을 표현
시작점 (0,0)은 1로 시작하고, 한 칸씩 이동할 때마다 누적되어 갱신.
BFS 추천 알고리즘 문제집