10-1. DFS (Depth-First Search)
10-1. DFS (Depth-First Search)
1. DFS란?
깊이 우선 탐색
- 말 그대로 한 방향으로 끝까지 파고들었다가,
- 더 갈 데 없으면 이전으로 돌아와서 다른 길을 탐색하는 방식
💡 동작 방식
예시 그래프:
1
2
3
4
5
    1
   / \
  2   3
 /     \
4       5
1 → 2 → 4 → (끝) → 백 → 3 → 5
→ 깊이 우선으로 계속 들어감 → 더 이상 없으면 백트래킹
 
2. DFS의 기본 구조
1
2
3
4
5
def dfs(node):
	visited[node] = True
	for neighbor in graph[node]:
		if not visited[neighbor]:
			dfs(neighbor)
 
3. 그래프 표현 방법
📌 인접 리스트 방식 (가장 많이 씀)
1
2
3
4
5
6
7
graph = {
	1: [2, 3],
	2: [4],
	3: [5],
	4: [],
	5: []
}
또는
1
2
3
4
5
graph = [[] for _ in range(n+1)]
graph[1].append(2)
graph[1].append(3)
...
 
4. DFS 2가지 구현 방법
| 방식 | 특징 | 
|---|---|
| 재귀 | 코드 짧고 간결함 | 
| 스택 기반 반복문 | 재귀 깊이가 깊을 때 필요 (stack 사용) | 
4.1 DFS 예제 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
def dfs(v):
	visited(v) = True
	print(v, end = ' ')
	for neighbor in graph[v]:
		if not visited[neighbor]:
			dfs[neighor]
graph = {
	1: [2, 3],
	2: [4],
	3: [5],
	4: [],
	5: []
}
visited = [False] * 6
dfs(1)
'''
1 [False, True, False, False, False, False] 
2 [False, True, True, False, False, False] 
4 [False, True, True, False, True, False] 
3 [False, True, True, True, True, False] 
5 [False, True, True, True, True, True]
    1
   / \
  2   3
 /     \
4       5
'''
4.2 DFS 예제 2 - 간단한 그래프 탐색 (스택)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def dfs_stack(start):
	stack = [start]
	while stack:
		v = stack.pop()
		if not visited[v]:
			visited[v] = True
			print(v, end = ' ')
			# 인접 노드를 역순으로 넣어야 순서 보장됨 
			for neighbor in reversed(graph[v]):
					stack.append(neighbor)
graph = {
	1: [2, 3],
	2: [4, 5],
	3: [],
	4: [],
	5: []
}
visited = [False] * 6
dfs_stack(1)
 
6. DFS는 어디에 쓰나?
| 분야 | 설명 | 
|---|---|
| 그래프 탐색 | 노드 방문 여부 판단 | 
| 연결 요소 찾기 | 섬의 개수, 친구 관계, 네트워크 | 
| 백트래킹 문제 | N-Queen, 조합, 미로 탐색 | 
| 사이클 판별 | 방향/무방향 그래프의 루프 존재 여부 | 
 This post is licensed under  CC BY 4.0  by the author.