Notice
Recent Posts
Recent Comments
Link
승코딩당당당
DFS(depth-first search) 깊이 우선 탐색 본문
그래프 문제를 풀다 보면 가장 먼저 접하게 되는 탐색 알고리즘이 깊이 우선 탐색(DFS)이다.
DFS는 그래프의 모든 노드를 빠짐없이 방문하기 위한 완전 탐색 기법 중 하나로, 구현이 비교적 직관적이어서 알고리즘 입문 단계에서 자주 사용된다.
이번 글에서는 DFS의 개념, 특징, 시간 복잡도, 그리고 어떤 문제들에 활용되는지까지 간단히 정리해보려고 한다. ✍️
깊이 우선 탐색이란?
그래프의 시작 노드에서 출발하여 한 방향으로 끝까지 깊게 탐색한 뒤,
더 이상 갈 곳이 없으면 이전 분기점으로 돌아가 다른 경로를 탐색하는 방식의 알고리즘이다.
즉,
- 한 노드를 방문하면
- 그 노드와 연결된 노드 중 하나를 선택해
- 최대 깊이까지 탐색을 먼저 수행하고
- 이후 다른 분기를 차례로 탐색한다.
이러한 동작 방식 때문에 DFS는 “깊게 들어갔다가 되돌아온다 🔁 ”는 흐름을 가진다.

DFS의 동작 방식과 구현 특징🔧
DFS는 다음 두 가지 방식으로 구현할 수 있다.
- 재귀 함수 사용
DFS는 재귀 호출 구조와 매우 잘 어울린다.
현재 노드를 방문한 뒤, 인접한 노드에 대해 다시 DFS를 호출하는 방식이다.
다만, 재귀 호출이 깊어질 경우 스택 오버플로(Stack Overflow) ⚠️ 가 발생할 수 있으므로 입력 크기가 큰 문제에서는 주의가 필요하다. - 스택(Stack) 자료구조 사용
재귀를 사용하지 않고, 명시적으로 스택을 이용해 DFS를 구현할 수도 있다.
이 방식은 재귀 호출에 대한 부담을 줄일 수 있다는 장점이 있다.
방문 체크의 중요성 📌
DFS에서는 이미 방문한 노드를 다시 방문하면 안 된다.
그래프에는 사이클이 존재할 수 있기 때문에, 방문 여부를 체크하지 않으면 같은 노드를 무한히 반복 방문하는 문제가 발생한다.
따라서 DFS 구현 시에는 반드시 다음과 같은 방문 배열이 필요하다.
- visited[node] = true → 방문 처리
- DFS 종료 후 필요하다면 다시 false로 되돌릴 수도 있음 (백트래킹)
시간 복잡도⏰
노드의 개수를 V, 에지(간선)의 개수를 E라고 할 때 DFS의 시간 복잡도는 다음과 같다.
O(V + E)
- 모든 노드를 한 번씩 방문하고
- 모든 간선을 한 번씩 확인하기 때문이다.
그래프의 크기가 커져도 효율적으로 동작하는 이유 중 하나다.
DFS로 풀 수 있는 대표적인 문제들
- 사이클 탐색
- 그래프에 사이클이 존재하는지 확인할 때 DFS가 사용된다.
- 방향 그래프에서 작업 순서를 정해야 할 때 DFS 기반 위상 정렬을 활용한다.
- 특정 노드를 제거했을 때
- 그래프가 두 개 이상의 컴포넌트로 분리된다면, 그 노드를 단절점이라고 한다.
- 특정 간선을 제거했을 때
- 그래프가 분리된다면, 그 간선을 단절선이라고 한다.
+ 아래 문제들을 풀어 보시면 좋습니다!
https://www.acmicpc.net/workbook/view/1833
'개발 > 알고리즘' 카테고리의 다른 글
| 오일러 피 (Euler’s Totient) - 서로소 개수 구하기 (0) | 2026.03.02 |
|---|---|
| 소수(prime number) 구하기 - 에라토스테네스의 체 (2) | 2026.02.02 |
| 그리디 알고리즘 (탐욕법, Greedy Algorithm) (0) | 2026.01.31 |
| 이진 탐색 (binary search) (1) | 2026.01.25 |
| BFS(breadth-first search) 너비 우선 탐색 (1) | 2026.01.11 |