DFS란?
트리나 그래프에서 한 루트로 탐색하다가 특정 상황에서 최대한 깊숙이 들어가서 확인한 뒤 다시 돌아가 다른 루트로 탐색하는 방식이다. 대표적으로 백트래킹에 사용한다. 일반적으로 재귀호출을 사용하여 구현하지만, 단순한 스택 배열로 구현하기도 한다. 구조상 스택 오버플로우를 유의해야 한다.
DFS의 특징
- 자기 자신을 호출하는 순환 알고리즘의 형태를 가지고 있다.
- 가중치가 주어지거나 특정 경로를 찾아야 할 때 DFS
- 그래프 탐색의 경우 어떤 노드를 방문했었는지 여부를 반드시 검사 해야 한다는 것이다.
스택을 이용한 DFS 동작과정
- 탐색 시작 노드를 스택에 삽입하고 방문 처리를 한다.
- 스택의 최상단 노드에 방문하지 않은 인접 노드가 있으면 그 인접 노드를 스택에 넣고 방문 처리를 한다. 방문하지 않은 인접 노드가 없으면 스택에서 최상단 노드를 꺼낸다.
- 2번의 과정을 더 이상 수행할 수 없을 때까지 반복한다.
'방문 처리'는 스택에 한 번 삽입되어 처리된 노드가 다시 삽입되지 않게 체크하는 것을 의미한다.
일반적으로 인접한 노드 중에서 방문하지 않은 노드가 여러 개 있으면 번호가 낮은 순서부터 처리한다.
위의 과정대로 진행하면 1 2 7 6 8 3 4 5 순으로 노드를 탐색하게 된다.
구현 코드
def dfs(graph, v, visited):
visited[v] = True
print(v, end=' ')
for i in graph[v]:
if not visited[i]:
dfs(graph, i, visited)
graph= [
[],
[2,3,8],
[1,7],
[1,4,5],
[3,5],
[3,4],
[7],
[2,6,8],
[1,7]
]
visited = [False]*9
print(dfs(graph,1,visited))
'Python > DFS&BFS' 카테고리의 다른 글
[Algorithm] 백준 2606 바이러스 | 파이썬 BFS (0) | 2024.06.26 |
---|---|
[Algorithm] 백준 14888 연산자 끼워 넣기 (삼성전자 SW 역량테스트 기출문제) | 파이썬 (0) | 2024.04.13 |
[Algorithm] 프로그래머스 타겟 넘버 | 파이썬 (0) | 2024.03.26 |
[Algorithm] 백준 1260 DFS와 BFS | 파이썬 (0) | 2024.01.17 |
[Algorithm] BFS(Breadth-first search,너비 우선 탐색) (1) | 2024.01.05 |
댓글