깊이 우선 탐색이라고도 부르며, 그래프에서 깊은 부분을 우선으로 탐색하는 알고리즘이다.
특정한 경로로 탐색하다가 특정한 상황에서 최대한 깊숙이 들어가서 노드를 방문한 후, 다시 돌아가 다른 경로로 탐색하는 알고리즘이다.
일반적으로 인접한 노드 중에서 반문하지 않은 노드가 여러 개 있으면 번호가 낮은 순서부터 처리한다.
깊이 우선 탐색 알고리즘인 DFS는 스택 자료구조에 기초한다는 점에서 구현이 간단하다. 실제로 스택을 쓰지 않아도 되며 탐색을 수행함에 있어서 데이터의 개수가 N개인 경우 O(N)의 시간이 소요된다는 특징이 있다.
또한 DFS는 스택을 이용하는 알고리즘이기 때문에 실제 구현은 재귀 함수를 이용했을 때 매우 간결하게 구현할 수 있다.
# DFS method 정의
def dfs(graph, v, visited):
# 현재 노드를 방문 처리
visited[v] = True
print(v, end='')
# 현재 노드와 연결된 다른 노드를 재귀적으로 방문
for i in graph[i]:
if not visited[i]: # 아직 방문하지 않았으면 방문한다. -> 방문했으면 그냥 지나가
dfs(graph, i, visited)
graph = [
[], # 0인 노드가 없음
[2,3,8], # 1인 노드가 2, 3, 8과 인접해 있음
[1,7], # ...
[3,5],
[3,4],
[7],
[2,6,8],
[1,7]
]
# 각 노드가 방문된 정보를 리스트 자료형으로 표현 (1차원 리스트)
visited = [False] * 9
# 정의된 DFS 함수 호출
dfs(graph, 1, visited)
1 2 7 6 8 3 4 5