Tech/Algorithm
[Algorithm] BFS / DFS
aeightchill
2025. 1. 24. 17:08
728x90
DFS
루트 노드 혹은 임의 노드에서 다음 브랜치로 넘어가기 전에, 해당 브랜치를 모두 탐색하는 방법
(스택 or 재귀 함수를 통해 구현)
- 가능한 한 깊이 내려가면서 탐색을 진행한다.
- 특정 경로를 찾거나, 그래프의 모든 노드를 방문하는 데 유용하다..
def dfs(graph, v, visited):
visited[v] = True
for i in graph[v]:
if not visited[i]:
dfs(graph, i, visited)
visited = [False] * n
dfs(graph, 1, visited)
BFS
루트 노드 혹은 임의 노드에서 인접한 노드부터 먼저 탐색하는 방법
- 인접한 노드를 먼저 탐색한다.
- 최단 경로를 찾는 데 유용하다.
def bfs(graph, start, visited):
queue = deque([start])
visited[start] = True
while queue:
v = queue.popleft()
for i in graph[v]:
if not visited[i]:
queue.append(i)
visited[i] = True
DFS vs. BFS
BFS | DFS | |
너비 우선 탐색 | 깊이 우선 탐색 | |
데이터 구조 | 최단 경로를 찾기 위해 queue 사용 | stack 사용 |
정의 | 다음 레벨로 이동하기 전에 먼저 동일한 레벨의 모든 노드를 살펴보는 순회 접근 방식 | 순회가 루트 노드에서 시작하여 근처에 방문하지 않은 노드가 없는 노드에 도달할 때까지 가능한 한 노드를 통해 진행하는 순회 접근 방식 |
builds the tree level by level | builds the tree sub-tree by sub-tree | |
접근 방식 | FIFO | LIFO |
더 가까운 정점을 검색하는 데 적합 | 더 먼 정저메 답이 있을 때 더 적합 | |
활용 | 최단 경로 찾기, 네트워크 탐색, 그래프의 레벨 순회 등 | 미로 찾기, 퍼즐 해결, 그래프의 모든 노드를 방문하는 문제 등 |
참고
https://www.geeksforgeeks.org/difference-between-bfs-and-dfs/
https://f-lab.kr/insight/understanding-dfs-and-bfs-algorithms-20240517
728x90