[알고리즘] DFS(Depth-First Search, 깊이 우선 탐색) 문제 풀이 가이드

2025. 7. 14. 13:53·CS/알고리즘 & 자료구조
728x90
반응형

개념

DFS(Depth-First Search,깊이 우선 탐색) 는 그래프나 트리와 같은 자료구조에서 탐색을 진행할 떄 사용하는 대표적인 알고리즘입니다.
특정 노드를 시작점으로 잡고 최대한 깊은 경로까지 탐색하다가, 더 이상 탐색할 곳이 없으면 백트래킹을 통해 돌아오며 탐색하지 않은 경로를 다시 탐색합니다.

즉, 깊게 먼저 들어가며 탐색하는 방식입니다.


DFS의 핵심 원리

하나의 노드를 선택해 방문한 후, 인접한 노드를 따라 갈 수 있는 곳까지 깊이 들어갑니다.
더 이상 이동할 곳이 없으면 이전 노드로 돌아와서 다시 탐색을 시작합니다.
방문한 곳을 기록해, 이미 방문한 노드는 재탐색하지 않습니다.

즉, “한쪽 방향 끝까지 먼저 파고든다”라는 생각하면 직관적으로 이해할 수 있습니다.


DFS 탐색 순서 예시

      1 (root node)
    /   \
   2     5
  / \   / \
 3   4 6   7

탐색 순서: 1 → 2 → 3 → 4 → 5 → 6 → 7


DFS의 시간 복잡도

일반적으로 O(N) ~ O(N²) 까지 다양합니다. 다만, 각 문제의 요구조건에 따라 가지치기(pruning) 기법으로 활용하여 탐색 횟수를 크게 줄일 수 있습니다.
즉, 조건에 부합하지 않은 탐색 경로를 미리 차단(return)하여 불필요한 탐색을 방지할 수 있습니다.


Java 코드로 DFS 알고리즘 가이드 보기

// 그래프를 인접리스트로 표현 (예시)
List<Integer>[] graph = new ArrayList[5];
for (int i = 0; i < graph.length; i++) {
    graph[i] = new ArrayList<>();
}
// 간선 연결 예시 (0→1, 0→2, 1→3, 2→4)
graph[0].add(1);
graph[0].add(2);
graph[1].add(3);
graph[2].add(4);

boolean[] visited = new boolean[5];  // 방문 여부 체크

dfs(0, graph, visited, 0);  // 0번 노드에서 DFS 탐색 시작, 초기 깊이는 0

// DFS 재귀 메서드 구현
public void dfs(int node, List<Integer>[] graph, boolean[] visited, int depth) {
    // 특정 조건에 따라 탐색을 중단할 수 있음 (가지치기)
    // 예시: 깊이가 3 이상이면 탐색 중지
    // if (depth >= 3) return;

    visited[node] = true; // 현재 노드를 방문 처리, 다음 깊이를 위해
    System.out.println("방문 노드: " + node + ", 현재 깊이: " + depth);

    // 현재 노드와 연결된 모든 인접 노드를 탐색
    for (int next : graph[node]) {
        if (!visited[next]) { // 방문하지 않은 노드만 탐색
            dfs(next, graph, visited, depth + 1);
        }
    }

    // 다른 경로 탐색을 위한 백트래킹 처리
    visited[node] = false;
}

코드 흐름 간략 정리

  • 현내 노드 방문 처리(visited[node] = true)
  • 현재 노드의 모든 인접 노드 탐색
  • 방문하지 않은 인접 노드가 있다면 재귀적으로 방문
  • 모든 인점 노드를 탐색하면 이전 호출로 되돌아가 계속 탐색(백트래킹)
  • 조건에 따라 가지치기하여 탐색 성능 향상 가능

DFS가 유용한 문제

  • 그래프 탐색 및 경로 탐색 관련 문제
    • 길찾기: 특정 노드에서 도달 가능한 모든 노드 찾기
  • 모든 경우의 수를 고려해야하는 완전탐색 및 백트래킹 문제
    • 미로 찾기, 조합(Combination), 순열(Permutation) 등
  • 트리 순회 문제
    • 전위(Pre-order)
    • 정위(Post-order)
    • 후위(In-order)
  • 연결 요소(Connected Component) 개수 찾기 문제

요약

DFS는 그래프나 트리처럼 특정 노드부터 최대한 깊이 들어가면서 탐색하는 알고리즘이며 가능한 깊게 탐색을 진행하고, 더 이상 탐색할 수 없을 때 이전으로 되돌아가 탐색하지 않은 노드를 다시 방문하는 방식입니다.

DFS는 탐색 대상의 전체 구조를 파악하거나 완전 탐색할 때 유용합니다.

반면, 최단거리와 같이 최적의 경로를 찾는 문제에서는 일반적으로 BFS가 더 효율적이며, 그래프가 매우 깊고 넖을 때 DFS는 스택 오버플로우가 발생할 가능성이 있습니다.

728x90
반응형
저작자표시 비영리 (새창열림)

'CS > 알고리즘 & 자료구조' 카테고리의 다른 글

[알고리즘] 슬라이딩 윈도우 풀이 가이드  (0) 2025.07.14
알고리즘 초보 탈출: DP(동적계획법)을 명확하게 이해하는 방법  (3) 2025.06.29
[수학적 처리] 증명된 수식을 로직으로  (1) 2025.06.27
[백준] BOJ 1874 스택 수열  (1) 2025.06.09
[백준] 숫자 카드 2  (0) 2025.06.09
'CS/알고리즘 & 자료구조' 카테고리의 다른 글
  • [알고리즘] 슬라이딩 윈도우 풀이 가이드
  • 알고리즘 초보 탈출: DP(동적계획법)을 명확하게 이해하는 방법
  • [수학적 처리] 증명된 수식을 로직으로
  • [백준] BOJ 1874 스택 수열
크크크크
크크크크
공뷰를 합시다.
    반응형
  • 크크크크
    Tom's Note
    크크크크
  • 전체
    오늘
    어제
    • 분류 전체보기 (130)
      • IT 지식 (6)
      • CS (66)
        • 알고리즘 & 자료구조 (19)
        • 운영체제 (41)
        • 네트워크 (1)
        • 데이터베이스 (5)
      • 보안 (6)
      • SW 공학 & 프로그래밍 언어 (5)
        • Java (28)
        • 디자인 패턴 (1)
        • 형상관리 (2)
        • 톰캣(WAS) (2)
        • SW 방법론 (3)
        • 스프링부트 (5)
      • 시스템 설계 (4)
        • Docker (2)
      • 자격증 (2)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      스프링부트
      java
      usermod
      비트연산
      리눅스
      ADsP
      알고리즘
      불변
      docker
      whereis
      DTO
      passwd
      2차
      단반향
      암호설정
      REST API
      /etc/passwd
      chmod
      문제해결
      cifs
      분석기법
      자바
      Chage
      apropos
      man
      DI
      su
      whatis
      which
      1급
    • 최근 댓글

    • 최근 글

    • 250x250
    • hELLO· Designed By정상우.v4.10.3
    크크크크
    [알고리즘] DFS(Depth-First Search, 깊이 우선 탐색) 문제 풀이 가이드
    상단으로

    티스토리툴바