Post

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.