#DFS

깊이 우선 탐색으로 경로 탐색, 트리 순회, 백트래킹 문제를 다룬다. 현재 4개의 풀이가 있다.

DFS 학습 가이드

필요한 주제만 펼쳐서 깊이 우선 탐색의 흐름, 방문 기록, 재귀와 백트래킹의 관계를 익힌다.

DFS 기본 개념

DFS(Depth-First Search)는 현재 노드에서 갈 수 있는 한 경로를 깊게 따라간 뒤, 더 갈 곳이 없으면 이전 분기점으로 돌아와 다른 경로를 탐색하는 알고리즘이다.

그래프의 한 가지를 깊게 따라간 뒤 다른 가지로 이동하는 DFS 탐색 순서
한 경로를 끝까지 탐색하고 돌아와 다음 가지를 확인한다.
  • 현재 노드: 지금 탐색 중인 정점 또는 상태
  • 인접 노드: 현재 노드에서 이동할 수 있는 다음 후보
  • 방문 기록: 같은 노드를 다시 처리하지 않기 위한 상태
  • 백트래킹: 현재 선택을 되돌리고 다른 후보를 시도하는 과정

그래프 연결 요소, 트리 순회, 경로 존재 여부, 조합 탐색처럼 한 분기를 끝까지 확인해야 하는 문제에 자주 쓴다.

재귀 DFS와 명시적 스택

재귀 DFS에서는 함수 호출 스택이 현재 탐색 경로를 자동으로 저장한다. 재귀 깊이가 걱정되거나 상태를 직접 제어해야 하면 리스트를 명시적인 스택으로 쓸 수 있다.

재귀 호출 스택과 명시적 스택이 DFS의 현재 경로를 저장하는 방식 비교
재귀 호출도 내부적으로는 현재 DFS 경로를 스택에 쌓아 관리한다.
def dfs(node):
    if visited[node]:
        return
    visited[node] = True

    for neighbor in graph[node]:
        dfs(neighbor)

방문 처리는 인접 노드를 재귀 호출하기 전에 해야 같은 노드가 여러 경로에서 반복 호출되는 것을 막을 수 있다.

방문 기록과 백트래킹

일반적인 그래프 DFS에서는 한 번 방문한 노드를 전체 탐색 동안 다시 방문하지 않는다. 반면 백트래킹에서는 현재 경로에서만 방문을 막고, 분기가 끝나면 상태를 복원해 다른 경로가 쓸 수 있게 한다.

DFS가 선택하고 탐색한 뒤 상태를 되돌려 다른 분기를 시도하는 백트래킹 과정
백트래킹은 DFS에 선택 상태의 복원과 다음 후보 시도를 결합한 방식이다.
문제 유형방문 상태 처리대표 활용
그래프 연결 요소전체 탐색 동안 유지연결된 그룹 개수
트리 순회부모 방향을 제외하거나 방문 기록깊이·경로 계산
경로 존재 여부재방문 방지도달 가능성 확인
조합·경로 생성재귀 반환 시 복원백트래킹
DFS 문제 풀이 절차
  1. 노드·상태를 무엇으로 볼지 정의한다.
  2. 현재 상태에서 이동 가능한 다음 후보를 정한다.
  3. 방문 기록 또는 현재 경로 상태를 확인한다.
  4. 방문 표시 후 재귀 또는 스택으로 다음 상태를 탐색한다.
  5. 백트래킹 문제라면 반환 전에 선택 상태를 원래대로 복원한다.

인접 리스트를 사용하는 그래프에서 모든 노드와 간선을 한 번씩 처리하면 시간 복잡도는 `O(V + E)`다. 방문 배열과 호출 스택을 포함한 공간 복잡도는 `O(V)`다.

자주 하는 실수
  • 재귀 호출 전에 방문 표시를 하지 않아 같은 노드를 반복 탐색하는 경우
  • 무방향 그래프의 간선을 한 방향으로만 저장하는 경우
  • 백트래킹에서 분기 종료 후 선택·방문 상태를 복원하지 않는 경우
  • 그래프 DFS의 영구 방문과 백트래킹의 경로별 방문을 혼동하는 경우
  • 깊은 그래프에서 Python 재귀 깊이 제한을 고려하지 않는 경우

전체 문제 풀이 보기