-
TIL-2024.03.09 - DFS - 깊이 우선 탐색> 기초/알고리즘 2024. 3. 10. 09:10
------- DFS
설명:
- DFS는 깊이 우선으로 그래프를 탐색하는 알고리즘.
- 이 알고리즘은 한 경로를 따라 최대한 깊이 탐색한 후, 다른 경로로 이동하여 탐색을 계속 진행.
- DFS는 스택(stack) 또는 재귀 함수를 사용하여 구현.
동작 원리:
- 시작 노드를 스택에 넣고 방문 표시.
- 스택이 빌 때까지 다음을 반복:
- 스택에서 하나의 노드를 빼기.
- 해당 노드와 인접한 미방문 노드 중 하나를 선택하여 스택에 넣고 방문 표시.
- 더 이상 진행할 수 없을 때까지 재귀적으로 반복.
- 모든 노드가 방문될 때까지 반복.
특징:
- 깊이 우선 탐색은 해를 찾을 때까지 모든 경로를 탐색.
- 메모리를 적게 사용.
- 재귀 함수 또는 스택을 사용하므로 구현이 다소 복잡.
예제:
function dfs(graph, start, visited = new Set()) { if (!visited.has(start)) { visited.add(start); console.log(start); let neighbors = graph[start]; for (let neighbor of neighbors) { dfs(graph, neighbor, visited); } } } // 예제 그래프 let graph = { 'A': ['B', 'C'], 'B': ['D'], 'C': ['E', 'F'], 'D': [], 'E': [], 'F': [] }; console.log("DFS 결과:"); dfs(graph, 'A');
BFS와의 차이:
그래프: A / \ B C / / \ D E F BFS 결과: A -> B -> C -> D -> E -> F DFS 결과: A -> B -> D -> C -> E -> F 예시: 1. 미로 문제: DFS가 미로를 탐색하는 데 유용합니다. > 깊이 우선 탐색은 한 방향으로 끝까지 탐색하고 막힌 경우 이전 단계로 돌아가서 다른 경로를 탐색합니다. 2. 최단 경로 문제: BFS가 최단 경로를 찾는 데 유용합니다. > 너비 우선 탐색은 모든 인접한 노드를 우선 탐색하므로 최단 경로를 먼저 찾을 수 있습니다.
사용 이유:
- 깊이 우선 탐색: 그래프의 깊은 부분을 탐색할 때 유용합니다. 예를 들어, 미로 찾기, 그래프의 모든 경로 찾기 등에서 사용.
- 그래프 순회: DFS는 그래프를 순회하고 모든 노드를 탐색하는 데 유용.
- 사이클 탐색: DFS는 사이클을 탐색하고 찾는 데 사용. 한 번 방문한 노드를 다시 방문하면 사이클이 있음을 표현.
'> 기초 > 알고리즘' 카테고리의 다른 글
TIL-2024.03.10 - BFS (너비 우선 탐색) (0) 2024.03.10 TIL-2024.03.08 - 재귀함수 (0) 2024.03.08 TIL-2024.03.07 - 알고리즘 - 이진 탐색(Binary Search) 알고리즘 (0) 2024.03.07 TIL-2024.02.29 - 알고리즘 - 정렬 알고리즘 (0) 2024.02.29 TIL-2024.02.28 - 알고리즘 - 다이나믹 프로그래밍 (0) 2024.02.28