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
'Tech > Algorithm' 카테고리의 다른 글
[Algorithm] Dynamic Programming (동적 계획법) (0) | 2025.02.17 |
---|---|
[Algorithm] Priority Queue (우선순위 큐) (0) | 2025.02.12 |
[Algorithm] Greedy (그리디 알고리즘) (0) | 2025.02.10 |
[Algorithm] Two Pointers (투 포인터) (0) | 2025.01.24 |
[Algorithm] Union-Find 알고리즘 (Disjoint Set) (0) | 2025.01.24 |