깊이우선 탐색이란?
깊이 우선 탐색은 그래프 완전 탐색 중 하나다.
DFS는 그래프 시작노드에서 출발하여 탐색할 한 쪽 분기를 정하여 최대 깊이까지 탐색을 마친 후 다른 쪽 분기로 이동하여 다시 탐색하는 알고리즘이다.
❗️ DFS 알아보기
- 기능: 그래프 완전 탐색
- 특징: 재귀 함수 구현, 스택(FIFO) 자료구조 이용
- 시간 복잡도: O(V+E)
- 문제 유형: 단절점 찾기, 단절선 찾기, 사이클 찾기, 위상정렬
* 깊이 우선 탐색 실제 구현 시 재귀함수를 이용하므로 스택오플로를 유의해야한다.
👉 깊이 우선 탐색의 핵심 이론
DFS는 한번 방문 한 노드를 다시 방문하므로 안되므로 노드 방문 여부를 체크할 배열이 필요하며,
그래프는 인접리스트를 표현한다. 그리고 DFS 탐색 방식은 후입선출 특성을 가지므로 스택을 이용해서 설명하겠다.
❗️ 1. DFS 시작할 노드를 정한 후, 사용할 자료구조 초기화하기
-> 인접리스트로 표현
스택에 시작 노드를 1로 삽입 할 때, 해당 위치의 방문 배열을 체크하면 T,F,F,F,F,F가 된다.
❗️ 2. 스택에서 노드를 꺼낸 후 꺼낸 노드의 인접 노트 다시 스택에 삽입하기
이제 POP을 수행하여 노드를 꺼냅니다.
꺼낸 노드를 탐색 순서에 기입하고 인접 리스트의 인접 노드를 스택에 삽입하여 방문 배열을 체크합니다.
방문 배열은 T,T,T,F,F,F가 됩니다.
❗️ 3. 스택 자료구조에 값이 없을 때 까지 반복하기
앞선 과정을 스택 자료 구조에 값이 없을 때 까지 반복합니다.
이 때 이미 다녀간 노드는 방문 배열은 재삽입 하지 않는 것이 핵심입니다.
👉 핵심 정리 1:
스택에 노드를 삽입할 때, 방문 배열을 체크하고
스택에서 노드를 뺄 때, 탐색 순서에 기록하며 인접 노드를 방문 배열과 대조하며 살펴보자.
👉 핵심 정리 2:
모든 노트를 탐색하여 탐색 종료 -> DFS 총 2 회 수행.
즉, 연결 요소 개수는 2개.
=> 모든 노드를 탐색하는데 실행한 DFS의 실행 횟수가 곧 연결 요소 개수와 같다.
'코팅테스트 > 알고리즘' 카테고리의 다른 글
[알고리즘] 셀 정렬(Shell Sort) (1) | 2023.03.29 |
---|---|
[알고리즘] 계수 정렬(Counting Sort) (0) | 2023.03.29 |
[알고리즘]시간복잡도 (0) | 2023.02.28 |
[알고리즘] BFS 너비우선탐색 정리 (0) | 2023.02.28 |
[알고리즘] 탐욕 알고리즘 (1) | 2023.02.20 |