[알고리즘] DFS(깊이 우선 탐색) 개념 및 구현
1. DFS(깊이 우선 탐색)란?
DFS(Depth-First Search, 깊이 우선 탐색)는 그래프 탐색 알고리즘 중 하나로, 한 노드에서 출발해 **최대한 깊이 탐색한 후, 다시 돌아와서 다른 경로를 탐색하는 방식**입니다.
일반적으로 **스택(Stack) 또는 재귀(Recursion)**을 이용하여 구현할 수 있습니다.
✔️ DFS의 시간 복잡도: O(V + E) (V: 노드 수, E: 간선 수)
2. DFS의 동작 원리
- 시작 노드를 방문하고, 방문한 노드를 **스택에 저장**
- 해당 노드에서 **방문하지 않은 인접 노드**를 찾고, 있다면 방문
- 더 이상 방문할 노드가 없으면 **스택에서 꺼내면서 뒤로 이동**
- 이 과정을 반복하여 모든 노드를 탐색
3. DFS 코드 구현 (반복문 & 재귀 방식)
✅ 1) DFS - 재귀(Recursion) 방식
import java.util.*;
public class DFSSample {
static boolean[] visited;
static List> graph = new ArrayList<>();
public static void dfs(int node) {
visited[node] = true;
System.out.print(node + " "); // 방문한 노드 출력
for (int next : graph.get(node)) {
if (!visited[next]) {
dfs(next);
}
}
}
public static void main(String[] args) {
int n = 6; // 노드 개수
visited = new boolean[n + 1];
// 그래프 초기화
for (int i = 0; i <= n; i++) {
graph.add(new ArrayList<>());
}
// 간선 추가
graph.get(1).add(2);
graph.get(1).add(3);
graph.get(2).add(4);
graph.get(2).add(5);
graph.get(3).add(6);
System.out.println("DFS 탐색 결과:");
dfs(1);
}
}
✅ 2) DFS - 스택(Stack) 활용 방식
import java.util.*;
public class DFSSampleStack {
static boolean[] visited;
static List> graph = new ArrayList<>();
public static void dfsStack(int start) {
Stack stack = new Stack<>();
stack.push(start);
while (!stack.isEmpty()) {
int node = stack.pop();
if (!visited[node]) {
visited[node] = true;
System.out.print(node + " ");
// 인접 노드를 역순으로 추가 (작은 번호부터 방문하려면 정렬 필요)
Collections.reverse(graph.get(node));
for (int next : graph.get(node)) {
if (!visited[next]) {
stack.push(next);
}
}
}
}
}
public static void main(String[] args) {
int n = 6; // 노드 개수
visited = new boolean[n + 1];
// 그래프 초기화
for (int i = 0; i <= n; i++) {
graph.add(new ArrayList<>());
}
// 간선 추가
graph.get(1).add(2);
graph.get(1).add(3);
graph.get(2).add(4);
graph.get(2).add(5);
graph.get(3).add(6);
System.out.println("DFS 탐색 결과:");
dfsStack(1);
}
}
4. DFS가 사용되는 대표적인 예시
- ✔ **미로 탐색** (경로 찾기)
- ✔ **그래프의 연결 요소 개수 찾기**
- ✔ **백트래킹(Backtracking)** (경우의 수 찾기)
- ✔ **강한 연결 요소(SCC) 탐색**
5. BFS와 비교
알고리즘 | 구현 방식 | 주요 특징 | 적용 사례 |
---|---|---|---|
DFS | 스택 / 재귀 | 최대한 깊이 탐색 후 백트래킹 | 백트래킹, 미로 탐색 |
BFS | 큐(Queue) | 최단 경로 탐색에 유리 | 최단 거리 문제, 네트워크 탐색 |
🔍 결론
DFS는 **그래프 탐색에서 가장 기본적이면서도 강력한 알고리즘**으로, 다양한 문제 해결에 활용됩니다. 특히 백트래킹 문제 해결에 많이 사용됩니다.
이제 DFS를 이해했다면, **BFS(너비 우선 탐색)와 비교해보는 것도 추천합니다!**
📖 관련 알고리즘도 함께 확인하세요!
'알고리즘 & 문제 해결 패턴 > 기본 알고리즘 & 자료구조' 카테고리의 다른 글
[알고리즘] DFS vs BFS : 차이점 및 언제 사용해야 할까? (0) | 2025.03.24 |
---|---|
[알고리즘 & 문제 해결 패턴] 해시 테이블(Hash Table) 개념과 활용 사례 (1) | 2025.03.19 |
[알고리즘 & 문제 해결 패턴] 탐욕 알고리즘(Greedy) 원리 및 활용 사례 (0) | 2025.03.17 |
[알고리즘 & 문제 해결 패턴] 다이나믹 프로그래밍(DP) 개념과 대표 문제 풀이 (1) | 2025.03.15 |
[알고리즘] 이진 탐색(Binary Search) 개념 및 구현 (0) | 2025.03.11 |