> 기초/알고리즘
TIL-2024.03.09 - DFS - 깊이 우선 탐색
Janku
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는 사이클을 탐색하고 찾는 데 사용. 한 번 방문한 노드를 다시 방문하면 사이클이 있음을 표현.