깊이 우선 탐색(DFS, Depth-First Search)은 그래프나 트리의 순회 방법 중 하나로, 한 경로를 선택해 갈 수 있을 때까지 최대한 깊게 파고들어 탐색한 후 더 이상 갈 곳이 없으면 이전 갈림길로 돌아와(Backtracking) 다른 경로를 마저 탐색하는 알고리즘입니다. 미로 찾기를 할 때 한쪽 벽만 계속 짚고 가는 방식과 유사합니다.
DFS는 구현 방식이 간단하며 트리 순회나 완전 탐색 문제에 자주 활용됩니다. 주로 재귀 호출(Recursion)이나 스택(Stack) 자료구조를 사용하여 구현합니다.
● 백트래킹(Backtracking) : 더 이상 방문할 노드가 없으면 직전에 방문했던 노드로 돌아갑니다.
● 방문 처리 필수 : 그래프에는 사이클(순환)이 존재할 수 있으므로 무한 루프에 빠지지 않기 위해 반드시 방문 여부(Visited)를 기록해야 합니다.
● 경로 기억 장점 : 특정 노드까지의 모든 경로 특징을 저장해야 할 때(예: 경로 상의 특정 제약 조건, 문자열 생성 등) BFS보다 유리합니다.
| 평가 기준 | 복잡도 | 심층 설명 |
|---|---|---|
| 시간 복잡도 (인접 리스트) | O(V + E) | V는 정점(Vertex), E는 간선(Edge)의 수입니다. 모든 정점을 한 번씩 방문하고 모든 간선을 탐색하므로 O(V + E)가 됩니다. |
| 시간 복잡도 (인접 행렬) | O(V²) | 간선의 유무를 확인하기 위해 매번 정점 수(V)만큼 반복문을 돌아야 하므로 정점이 많을 때는 리스트보다 불리합니다. |
| 공간 복잡도 | O(V) | 재귀 호출의 콜 스택 크기나 방문 배열 크기가 그래프 깊이에 비례하므로 최대 정점 수인 O(V)의 공간이 필요합니다. |
단순히 '최단 거리'를 구해야 한다면 BFS가 절대적으로 유리합니다. 하지만 각 경로가 가지고 있는 고유한 특성(예: 제약 조건, 방문 노드 경로 저장)을 챙겨가며 끝까지 탐색해야 하거나 백트래킹을 써서 경우의 수를 효율적으로 끊어내야 할 때는 메모리를 적게 먹는 DFS를 선택하는 것이 실무 코딩 테스트나 엔진 로직의 정석입니다.