DFS 깊이 우선 탐색 알고리즘
특정한 경로로 탐색하다가 특정한 상황에서 최대한 깊숙이 들어가서 노드를 방문한 후,
다시 돌아가 다른 경로로 탐색하는 알고리즘
1) 탐색 시작 노드를DFS 깊이 우선 탐색 알고리즘
특정한 경로로 탐색하다가 특정한 상황에서 최대한 깊숙이 들어가서 노드를 방문한 후,
다시 돌아가 다른 경로로 탐색하는 알고리즘
1) 탐색 시작 노드를 스택에 삽입하고 방문 처리를 한다.
2) 스택의 최상단 노드에 방문하지 않은 인접 노드가 있으면 그 인접 노드를 스택에 넣고 "방문 처리"한다.
방문하지 않은 인접 노드가 없으면 스택에서 최상단 노드를 꺼낸다.
3) 2) 번의 과정을 더이상 수행할 수 없을 때까지 반복한다."
여기서 "방문처리" 는 스택에 한 번 삽입되어 처리된 노드가 다시 삽입되지 않게 체크하는 것을 의미한다.
방문 처리를 함으로써 각 노드를 한 번씩만 처리할 수 있다.(개인적으로 가장 유용하다 생각)
# DFS 함수 정의
def dfs(graph, v, visited):
# 현재 노드를 방문 처리
visited[v] = True
print(v, end=' ')
# 현재 노드와 연결된 다른 노드를 재귀적으로 방문
for i in graph[v]:
if not visited[i]: 방문하지 않았을 때
dfs(graph, i, visited) <---- 재귀함수
# 각 노드가 연결된 정보를 리스트 자료형으로 표현(2차원 리스트)
graph = [
[],
[2, 3, 8],
[1, 7],
[1, 4, 5],
[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
위와 같은 알고리즘은 재귀함수를 사용했다.
<출처> 이 것이 코딩 테스트다 <나동빈 지음>
'알고리즘 공부 > BFS & DFS' 카테고리의 다른 글
[백준] 1012번 유기농 배추 - 파이썬 (0) | 2021.08.18 |
---|---|
[백준] 2606번 단지번호붙이기 - 파이썬 (0) | 2021.08.17 |
[백준] 2606번 바이러스 - 파이썬 (0) | 2021.08.17 |
[백준] 1260번 DFS와 BFS- 파이썬 (0) | 2021.08.17 |
BFS "너비 우선 탐색" 알고리즘 (0) | 2021.03.31 |