Java

[Java] DFS

bornsoon 2025. 4. 26. 00:56

스택 DFS를 사용하는 것이 더 안전 (재귀는 스택 오버플로우 위험)

import java.util.Stack;

public class Main {

    private static boolean[] visited;
    
    public static void main(String[] args) {
    	// 예제 그래프 초기화 (0번부터 8번까지의 노드)
    	int n = 9;
        graph = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            graph.add(new ArrayList<>());
        }
        
        // 간선 추가 (양방향)
        addEdge(0, 1);
        addEdge(0, 2);
        addEdge(1, 3);
        addEdge(1, 4);
        addEdge(2, 5);
        addEdge(2, 6);
        addEdge(3, 7);
        addEdge(4, 8);
        
        visited = new boolean[n];
        
        dfsRecursive(0);
        
        dfsIterative(0);
    }
           
    // 그래프에 간선 추가 (양방향)
    private static void addEdge(int u, int v) {
        graph.get(u).add(v);
        graph.get(v).add(u);
    }
    
    // 재귀
    public static void dfsRecursive(int node) {
    	StringBuilder sb = new StringBuilder();
    
        visited[node] = true;
        sb.append(node + " ");
        
        for (int neighbor : graph.get(node)) {
            if (!visited[neighbor] {
                dfsRecursive(neighbor);
            }
        }
        System.out.println(sb.toString());
    }
    
    // 스택
    public static void dfsIterative(int start) {
        StringBuilder sb = new StringBuilder();
        Static<Integer> Stack = new Stack();
        boolean[] visited = new boolean[graph.size()];
        
        // 시작 노드 처리
        stack.push(start);
        
        while (!stack.isEmpty()) {
            int current = stack.pop();
            
            if (!visited[current]) {
                visited[current] = true;
                sb.append(current + " ");
                
                // 인접 노드들을 스택에 추가 (순서 유지를 위해 역순으로)
                List<Integer> neighbors = graph.get(current);
                for (int i = neighbor.size() - 1; i >= 0; i--) {
                    int neighbor = neighbors.get(i);
                    if (!visited[neighbor]) {
                        stack.push(neighbor);
                    }
                }
            }
        }
        System.out.println(sb.toString());
    }
}
728x90

'Java' 카테고리의 다른 글

[Java] 컬렉션(collection) (컨테이너(container))  (0) 2025.04.29
[Java] Comparator, CompareTo, thenComparing  (0) 2025.04.28
[Java] BFS  (0) 2025.04.26
[Java] StringBuilder  (0) 2025.04.25
[Java] ProcessBuilder  (0) 2025.03.25