DFS
🧭 DFS
정의
DFS(Depth-First Search)는 그래프나 트리를 깊이 우선으로 탐색하는 알고리즘이다.
DFS는 한 방향으로 최대한 깊게 들어간 뒤 더 이상 갈 수 없으면 되돌아오는 방식으로 동작한다.
재귀나 스택으로 구현하는 경우가 많다.
🧩 DFS를 잘 쓰는 경우
- 모든 경로를 탐색해야 할 때
- 재귀적으로 문제를 풀기 쉬울 때
- 완전 탐색이 필요한 문제일 때
🧭 구현 포인트
- 반환값을 전역 변수로 둘지 먼저 정한다.
- 방문 여부를 저장할 자료구조를 준비한다.
- 함수의 종료 조건을 명확하게 둔다.
- 다음 노드를 탐색할 때 재귀 호출 또는 스택을 사용한다.
🧪 Java 샘플 코드
1. 기본 DFS 템플릿
import java.util.*;
public class Main {
static ArrayList<Integer>[] graph;
static boolean[] visited;
public static void main(String[] args) {
int n = 5;
graph = new ArrayList[n + 1];
visited = new boolean[n + 1];
for (int i = 0; i <= n; i++) {
graph[i] = new ArrayList<>();
}
graph[1].add(2);
graph[1].add(3);
graph[2].add(4);
graph[2].add(5);
dfs(1);
}
static void dfs(int node) {
visited[node] = true;
System.out.println(node);
for (int next : graph[node]) {
if (!visited[next]) {
dfs(next);
}
}
}
}
2. 재귀 호출로 완전 탐색하는 템플릿
public class Main {
static int answer = 0;
public static void main(String[] args) {
dfs("", 0);
System.out.println(answer);
}
static void dfs(String current, int depth) {
if (depth == 5) {
answer++;
return;
}
for (char c : new char[] {'A', 'E', 'I', 'O', 'U'}) {
dfs(current + c, depth + 1);
}
}
}
⚠️ 주의사항
- 사이클이 있는 그래프에서는 방문 체크가 필요하다.
- 재귀 호출이 너무 깊어지면 스택 오버플로우가 날 수 있다.
댓글남기기