10-2. BFS (Breadth-First Search)
10-2. BFS (Breadth-First Search)
1. BFS란?
Breadth-First Search: 너비 우선 탐색
- DFS가 “한 방향으로 끝까지 파고들었다면”,
- BFS는 가까운 노드부터 차례차례 넓게 탐색
💡 동작 방식
예시 그래프:
1
2
3
4
5
6
7
8
9
10
11
12
13
graph = {
	1: [2, 3],
	2: [4],
	3: [5],
	4: [],
	5: []
}
    1
   / \
  2   3
 /     \
4       5
1 → 2 → 3 → 4 → 5
→ 즉, 레벨 단위로 퍼져나감
 
2. BFS 기본 구조
1
2
3
4
5
6
7
8
9
10
11
12
13
14
from collections import deque
def bfs(start):
	queue = deque([start])
	visited[start] = True
	while queue:
		v = visited.popleft()
		print(v, end=' ')
		for neighbor in graph[v]:
			if not visited[neighbor]:
				visited[neighbor] = True
				queue.append(neighbor)
 
3. DFS vs BFS 차이
| 항목 | DFS | BFS | 
|---|---|---|
| 구조 | 재귀/스택 | 큐 | 
| 방향 | 깊이 우선 | 너비 우선 | 
| 최단거리 | ❌ 보장 안함 | ✅ 보장 | 
| 백트래킹 용도 | 적합 | 부적합 | 
| 탐색 순서 | 깊이 → 깊이 | 레벨 → 레벨 | 
 
4. BFS 예제 1 – 기본 그래프 순회
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
31
32
33
34
35
36
37
38
39
40
from collections import deque
def bfs(start):
	queue = deque([start])	
	visited[start] = True
	while queue:
		v = queue.popleft()
		print(v, end = ' ')
		for neighbor in graph[v]:
			if not visited[neighbor]:
				visited[neighbor] = True
				queue.append(neighbor)
	return
graph = {
	1: [2, 3],
	2: [4, 5],
	3: [],
	4: [],
	5: []
}
'''
    1
   / \
  2   3
 / \    
4   5     
'''
visited = [False] * 6
bfs(1)
''' 출력
1 2 3 4 5
'''
 
5. BFS 핵심 개념 요약
| 항목 | 설명 | 
|---|---|
| 탐색 방식 | 가까운 곳부터 탐색 | 
| 자료구조 | 큐 (Queue) 사용 | 
| 방문 순서 | 레벨 순서 (거리 기준) | 
| 구현 난이도 | DFS보다 약간 복잡하지만 안전함 (스택 오버플로우 없음) | 
| 용도 | 최단거리 탐색, 거리 측정, 경로 복원 등 | 
 This post is licensed under  CC BY 4.0  by the author.