목차
이전 글에서는 DFS를 스택으로 구현했다면, 이번에는 더 널리 사용되는 방식인 DFS를 사용해서 구현해보자.
이전글 에서 기본 개념과 스택 구현 방법을 확인해보세요.
[이론] DFS- (1) 스택으로 구현하기
목차깊이 우선 탐색이란?: 하나의 트리를 최대한 깊이 탐색하는 알고리즘이다. 사진을 보면 이해하기 쉽다. - 탐색 순서: A-B-D-E-F-C-G-H-I-J(자식 탐색 순서는 달라질 수 있다.) 구현 방법 크게 2
jihu-sunbae.tistory.com
학습 목표
- python 으로 재귀 기반 DFS를 구현할 수 있다.
- DFS의 재귀적인 성질을 이해한다.
DFS와 재귀
DFS는 그래프를 탐색할 때 한 노드에서 출발하여 가능한 깊이 들어가서 탐색한 다음, 더 이상 탐색할 노드가 없으면(리프 노드)
다시 이전 노드로 돌아와서(백트래킹) 다른 경로를 가능한 깊이 탐색한다.
재귀 함수의 경우 동일한 알고리즘으로 적용하여 큰 문제를 작은 하위 문제로 나누어 가면서 풀 수 있을 때 사용한다.
즉, 깊이 우선 탐색도 더이상 탐색할 노드가 없을 때, 백트래킹하여 다른 서브트리에 깊이 우선 탐색을 진행하므로 재귀적인 성격이 있다.
수도 코드
1. 시작 노드 a를 방문 처리함
2. a 노드의 인접 노드를 모두 순회.
- a의 주변 노드를 모두 방문했다면 탐색을 멈춘다.
- a의 주변 노드 중 방문하지 않은 노드 b가 있을 때
- a의 주변 노드를 모두 방문하기 전, 방문하지 않은 노드 b의 subtree를 모두 방문함. ⇒ 깊이 우선 탐색
- b의 subtree를 모두 방문했을 때는 다시 노드 a로 돌아가(backtracking) 주변 노드 중 방문하지 않은 노드 c를 방문한다.
코드
재귀함수를 짤 때는 3가지 구현 조건이 있음을 유의하고 구현하도록 한다.
+ 재귀 함수를 실제 구현할 때 고려하면 좋은 점
- 종료 조건, 함수 인자를 어떤 것을 쓸 것인지, 값을 어떤 형태로 리턴할 것인지/아니면 값을 인쇄할 것인지
# 그래프 정의
graph = dict()
# key: 부모노드, value: 자식 노드 리스트
graph['A'] = ['B', 'C']
graph['B'] = ['A', 'D']
graph['C'] = ['A', 'G', 'H', 'I']
graph['D'] = ['B', 'E', 'F']
graph['E'] = ['D']
graph['F'] = ['D']
graph['G'] = ['C']
graph['H'] = ['C']
graph['I'] = ['C', 'J']
graph['J'] = ['I']
def DFS_recursion(graph, node, visited):
# 종료 조건: 그래프의 모든 노드를 방문했을 때
visited.append(node)
# 아닐 경우
for adj_node in graph[node]:
if adj_node not in visited:
DFS_recursion(graph,adj_node, visited)
return visited
print(DFS_recursion(graph, 'A', []))
# ['A', 'B', 'D', 'E', 'F', 'C', 'G', 'H', 'I', 'J']
Reference
DFS 완벽 구현하기 [Python]
1. DFS의 기본 개념 2. 스택/큐를 활용한 DFS 구현하기 3. 재귀함수를 이용한 DFS 구현하기 1. DFS의 기본 개념 (1) 기본개념 DFS란 Depth first search의 약자로서 그래프 자료에서 데이터를 탐색하는 알고리
data-marketing-bk.tistory.com
재귀 알고리즘을 사용하는 3가지 단계
어떻게 풀 것인지 접근방법을 생각해보자 | 알고리즘 공부를 시작했다. 언제 재귀 알고리즘을 써야하는지, 어떻게 접근해야하는지 나름대로 접근법을 만들었고, 이를 공유해보고자 한다. 나만
brunch.co.kr
'Algorithm' 카테고리의 다른 글
★ [카카오기출][Python] 키패드 누르기 (0) | 2024.08.01 |
---|---|
[BoJ][Python] 2468 안전영역 (0) | 2024.07.31 |
[이론] DFS- (1) 스택으로 구현하기 (0) | 2024.07.31 |
[BoJ][Python] 1012 유기농 배추 (0) | 2024.07.29 |
★ [BoJ][Python] 11655 ROT13 (0) | 2024.07.25 |