BFS는 그래프 탐색의 가장 기본이 되는 방법 중 하나입니다. 시작점에서 가까운 정점부터 층별로 방문한다는 점이 핵심입니다.
BFS란?
BFS(Breadth-First Search)는 가까운 정점부터 차례대로 탐색하는 방식입니다. 그래서 흔히 "너비 우선 탐색"이라고 부릅니다.
핵심 자료구조
큐(Queue)
예제 그래프
0 ─── 1
│ │
└ 2 ── 3
│ │
└ 2 ── 3
시작 정점
0에서 시작한다고 가정합니다.
BFS가 큐를 쓰는 이유
큐는 먼저 들어온 데이터가 먼저 나가는 구조입니다. 따라서 시작점 근처에서 발견한 정점들을 순서대로 처리할 수 있어, 자연스럽게 가까운 정점부터 탐색하게 됩니다.
탐색 과정을 단계별로 보기
초기 상태
visited = [0]
queue = [0]
0을 꺼냄
0과 연결된 정점은 1, 2입니다.
visited = [0, 1, 2]
queue = [1, 2]
1을 꺼냄
1과 연결된 정점 0, 2는 이미 방문했습니다.
visited = [0, 1, 2]
queue = [2]
2를 꺼냄
2와 연결된 정점 중 아직 방문하지 않은 3을 새로 방문합니다.
visited = [0, 1, 2, 3]
queue = [3]
3을 꺼냄
더 이상 새로 방문할 정점이 없습니다.
최종 결과 = [0, 1, 2, 3]
한눈에 보는 BFS 순서표
| 단계 | 현재 정점 | 새로 방문한 정점 | 방문 결과 |
|---|---|---|---|
| 1 | 0 | 1, 2 | [0, 1, 2] |
| 2 | 1 | 없음 | [0, 1, 2] |
| 3 | 2 | 3 | [0, 1, 2, 3] |
| 4 | 3 | 없음 | [0, 1, 2, 3] |
풀이 핵심
시작 정점을 큐에 넣고, 큐에서 하나씩 꺼내면서 인접한 정점 중 아직 방문하지 않은 정점을 다시 큐에 넣습니다. 이 과정을 큐가 빌 때까지 반복하면 됩니다.
정답 코드
from collections import deque
def bfs(graph, start):
"""
너비 우선 탐색
"""
visited = [start]
queue = deque([start])
while queue:
current = queue.popleft()
for next_node in graph[current]:
if next_node not in visited:
visited.append(next_node)
queue.append(next_node)
return visited
# 테스트 케이스
if __name__ == "__main__":
graph = {
0: [1, 2],
1: [0, 2],
2: [0, 1, 3],
3: [2]
}
print("=== BFS (너비 우선 탐색) ===")
result = bfs(graph, 0)
print(f"시작 정점: 0")
print(f"방문 순서: {result}")
주의할 점
방문 체크를 하지 않으면 이미 본 정점을 또 큐에 넣게 됩니다. 따라서 BFS에서는 visited 관리가 필수입니다.
'크래프톤 정글 > 정글에서 문제풀기' 카테고리의 다른 글
| [정글 베이직 25] 위상 정렬(Topological Sort) 완전 정리 (0) | 2026.03.20 |
|---|---|
| [정글 베이직 24] DFS(깊이 우선 탐색) (0) | 2026.03.20 |
| [정글 베이직 22] 그래프 기본 - 인접 리스트 표현 완전 정리 (0) | 2026.03.20 |
| [정글 베이직 21] 이진 검색 트리(BST) (0) | 2026.03.20 |
| [정글 베이직 20]이진 트리(Binary Tree) 기본 개념과 전위·중위·후위 순회 완전 정리 (0) | 2026.03.20 |