BFS란?
BFS(Breadth-First Search, 너비 우선 탐색) 는 시작점에서 가까운 정점부터
차례로 탐색하는 방법입니다. 거리 1인 정점을 모두 본 뒤 거리 2, 그다음 거리 3...
이렇게 물결이 퍼지듯 동심원으로 넓혀 갑니다.
이 성질 덕분에 BFS는 가중치 없는 그래프의 최단 거리를 구하는 표준 도구입니다.
1. 큐가 핵심 부품
BFS는 큐(FIFO) 로 구현합니다. 큐의 "먼저 들어온 것이 먼저 나온다"는 성질이
"가까운 정점을 먼저 처리한다"를 자동으로 보장합니다.
- 시작 정점을 큐에 넣고 방문 표시.
- 큐에서 하나 꺼내, 이어진 정점 중 안 가본 곳을 모두 큐에 넣고 표시.
- 큐가 빌 때까지 반복.
거리 \(d\)인 정점들이 큐에서 모두 빠진 뒤에야 거리 \(d+1\)인 정점들이 처리됩니다.
2. 최단 거리가 보장되는 이유
BFS는 정점을 거리 순서대로 방문합니다. 어떤 정점에 처음 도달했을 때의
거리가 곧 최단 거리입니다 — 더 짧은 경로가 있었다면 그 경로로 먼저 도달했을
테니까요.
그래서 BFS는 "한 출발점에서 모든 정점까지의 최단 거리(간선 수)"를 \(O(V + E)\)에
한 번에 구합니다. 단, 모든 간선의 가중치가 같을 때만 성립합니다. 가중치가
다르면 다익스트라가 필요합니다.
3. 거리 배열로 방문과 거리를 동시에
방문 여부와 거리를 따로 관리할 필요 없이, dist 배열 하나로 둘 다 처리하는 것이
깔끔합니다.
dist[시작] = 0
이웃 v가 아직 -1(미방문)이면: dist[v] = dist[현재] + 1
dist[v] != -1이면 이미 방문한 것이니, 별도 방문 배열이 필요 없습니다.
4. BFS로 푸는 대표 문제
| 문제 | BFS 활용 |
|---|---|
| 미로 최단 경로 | 격자 BFS, 칸 = 정점 |
| 최소 이동 횟수 | 한 번 이동 = 간선 하나 |
| 그래프 거리/레벨 | 시작점에서의 거리 |
| 다중 시작점 전파(불·물 번짐) | 여러 점을 동시에 큐에 |
| 이분 그래프 판정 | 레벨로 두 색 칠하기 |
특히 격자 미로의 최단 거리가 BFS의 간판 문제입니다.
5. 변형: 0-1 BFS, 다중 시작점
- 다중 시작점 BFS: 처음에 여러 정점을 동시에 큐에 넣으면, 가장 가까운
시작점까지의 거리를 한 번에 구합니다(예: 여러 곳에서 동시에 번지는 불). - 0-1 BFS: 가중치가 0과 1뿐이면, 덱을 써서 0짜리는 앞에, 1짜리는 뒤에 넣어
다익스트라 없이 최단 거리를 구합니다.
정리
BFS는 가까운 곳부터 물결처럼 퍼지는 탐색이며, 큐로 구현합니다. 가중치 없는
그래프의 최단 거리를 \(O(V+E)\)에 구하는 것이 핵심 용도입니다. 다음 강의에서
미로 BFS를 코드로 완성합니다.