코딩 테스트에서 자주 나오는 DFS(Depth-First Search)와 재귀(Recursion)를 이해하기 쉽게 정리해보기
매번 헷갈려해서 한번 문서화해두는 것이 나중에 참고하기도 편할 것 같다....
DFS는 “갈 수 있을 때까지 끝까지 탐색하는 방식”이다.
다음과 같은 구조를 생각해보자:
내 방 → 거실 → 부엌
↓
화장실
탐색 순서:
핵심:
끝까지 간다 → 막히면 돌아온다 → 다른 길 탐색
function dfs(node) {
visited[node] = true;
for (연결된 노드들) {
if (아직 방문 안했으면) {
dfs(다음 노드);
}
}
}
재귀는 함수가 자기 자신을 다시 호출하는 방식이다.
function f() {
f();
}
function countDown(n) {
if (n === 0) return;
console.log(n);
countDown(n - 1);
}
실행 흐름:
countDown(3)
→ 3 출력
→ countDown(2)
→ 2 출력
→ countDown(1)
→ 1 출력
→ countDown(0)
→ 종료
DFS는 재귀를 사용해 구현하는 경우가 많다.
function dfs(node) {
visited[node] = true;
for (let i = 0; i < n; i++) {
if (연결 && 방문 안함) {
dfs(i);
}
}
}
의미:
그래프:
0 — 1 — 2
실행:
dfs(0)
→ dfs(1)
→ dfs(2)
→ 종료
→ 복귀
→ 복귀
dfs(0)
0 방문, 1로 이동
dfs(1)
1 방문, 2로 이동
dfs(2)
2 방문, 더 이상 이동 불가 → 종료
복귀:
dfs(2) → dfs(1) → dfs(0)
visited[node] = true;
if (연결 && !visited)
dfs(next);
DFS는 갈 수 있는 곳까지 계속 들어가는 재귀 기반 탐색이다.