백엔드개발/Java

[JAVA] DFS 깊이 우선 탐색

aaahyunseo 2025. 1. 28. 18:31

 

DFS 깊이 우선 탐색

: DFS(Depth First Search)는 하나의 정점으로부터 시작하여 깊은 곳 우선으로 탐색하여, 더 이상 갈 곳이 없을 경우 이전 단계로 되돌아가 다른 경로를 탐색해 최종적으로는 연결된 모든 정점을 탐색하는 방법이다.

 

 

📍 DFS 특징

  • 재귀적 또는 스택을 이용해 구현한다.
  • 각 정점의 방문 여부를 확인하기 위해 방문 배열을 사용한다. (예. int[] visited)
  • 그래프가 순환 구조를 가질 경우, 무한 루프 방지를 위해 반드시 방문 여부를 체크해야 한다.

 

📍 DFS 시간 복잡도

  • 인접 리스트 사용 시 : O(V+E) → V: 노드 수/ E: 간선 수
  • 인접 행렬 사용 시 : O(V^2)

 

📍 DFS 동작 알고리즘

1. 시작 노드를 방문하고 방문 여부를 체크한다.

2. 해당 노드와 연결된 인접 노드 중 방문하지 않은 노드를 탐색한다.

3. 더 이상 방문할 노드가 없으면 이전 노드로 되돌아간다.

4. 모든 노드를 방문할 때까지 반복한다.

 

 

📍 DFS 코드 구현해보기

 

✔️ 재귀

public class Main{
    static Stack<Integer> stack = new Stack<>();
    static StringBuilder sb = new StringBuilder();
    static boolean node[][] = new boolean[n+1][n+1], visited[] = new boolean[n+1];
    
    static void dfs(int v) {
        if(visited[v])
            return;
        sb.append(v+" ");
        for(int i=1; i<=n; i++)
            if(node[v][i] && !visited[i]) {
                visited[i] = true;
                dfs(i);
            }
    }
    
}

 

✔️ 스택 사용

public static String dfs(int v, boolean node[][]) {
    StringBuilder sb = new StringBuilder();
    Stack<Integer> stack = new Stack<>();
    boolean visited[] = new boolean[n+1];
    
    stack.add(v);
    int idx;
    
    while(!stack.isEmpty()) {
        idx = stack.pop();
        
        if(visited[idx])
            continue;
        visited[idx] = true;
        
        sb.append(idx+" ");
        
        for(int i=0; i<n; i++)
            if(node[idx][i] && !visited[i])
                stack.add(i);
    }
    return sb.toString();
}

 

 

📍DFS 사용 예시

  • 전위 순회
  • 미로 탐색
  • 그래프 연결요소 찾기

'백엔드개발 > Java' 카테고리의 다른 글

[JAVA] BFS 너비 우선 탐색  (0) 2025.01.24
[Java] 자바 스트림(Stream)  (0) 2024.11.01
[Java] 정적(Static) 멤버의 사용  (1) 2024.10.31
[Java] 일급 컬렉션  (0) 2024.10.30
[JAVA] StringBuilder  (2) 2024.10.12