상세 컨텐츠

본문 제목

1260. DFS와 BFS

Algorithm

by aeongiii 2025. 1. 20. 23:09

본문

1. 문제 분석
    1) 첫째줄에서 정점 개수 N, 간선 개수 M, 시작 번호 V가 주어진다.
    2) M개의 줄에 걸쳐서 연결되는 두 정점의 번호가 주어진다.
    3) 첫째 줄에 DFS 수행한 결과 출력 - 방문된 점 순서대로 출력
    4) 둘째줄에 BFS.


2. 제약 조건
    1) 1 <= N <= 1000
    2) 1 <= M <= 10000
    3) 방문할 수 있는 정점이 여러개인 경우 작은 정점부터 방문한다.

3. 의사결정
    1) N, M, V를 받는다.
    2) N, N 크기의 불형 이차원 배열을 만들고 (a, b), (b, a)를 true로 바꾼다.
    3) dfs 함수를 만들고 호출한다. 더이상 방문할 점이 없는 경우 종료 -> 순서 출력한다.
    4) bfs 함수 만들고 똑같이 출력

4. 문제풀이
    1) dfs : 한 노드에 대해서 끝까지 탐색한 후 되돌아와서 다음 노드 탐색 (백트래킹).
    깊이 제한이 없는 경우 스택 오버플로우 가능성.
    * dfs 구현시 특징
        - for문 전에 방문처리 한다.
        - for문 돌려서 -> 연결되어있는데 방문 안했으면 바로 재귀호출 한다.
    2) bfs : 현재 노드에서 가까운 노드부터 탐색. 메모리 사용량이 많다.
    * bfs 구현시 특징
        - 시작 노드 방문처리한 이후에는 큐에 삽입할 때 방문처리 한다.
        - while문에서 큐 하나씩 꺼내서 -> for문 돌려서 -> 연결되어있는데 방문 안한거 있으면 큐에 추가한다.

import java.io.*;
import java.util.*;

public class Main {

    static int N, M, V;
    static List<Integer>[] graph;
    static boolean[] visited;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        // 입력 받기 (N, M, V)
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
        V = Integer.parseInt(st.nextToken());

        // 인접 리스트 초기화
        graph = new ArrayList[N + 1];
        for (int i = 1; i <= N; i++) {
            graph[i] = new ArrayList<>();
        }

        // 간선 정보 입력
        for (int i = 0; i < M; i++) {
            st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());

            graph[a].add(b);
            graph[b].add(a);
        }

        // 작은 정점부터 방문하도록 정렬
        for (int i = 1; i <= N; i++) {
            Collections.sort(graph[i]);
        }

        // DFS 수행
        visited = new boolean[N + 1];
        StringBuilder dfsResult = new StringBuilder();
        dfs(V, dfsResult);
        System.out.println(dfsResult.toString().trim());

        // BFS 수행
        visited = new boolean[N + 1];
        System.out.println(bfs(V));
    }

    private static void dfs(int node, StringBuilder result) {
        visited[node] = true; // DFS는 방문 처리 후 재귀 호출
        result.append(node).append(" ");

        for (int next : graph[node]) {
            if (!visited[next]) {
                dfs(next, result);
            }
        }
    }

    private static String bfs(int start) {
        StringBuilder result = new StringBuilder();
        Queue<Integer> queue = new LinkedList<>();
        queue.add(start);
        visited[start] = true; // BFS는 큐에 추가할 때 방문 처리

        while (!queue.isEmpty()) {
            int node = queue.poll();
            result.append(node).append(" ");

            for (int next : graph[node]) {
                if (!visited[next]) {
                    queue.add(next);
                    visited[next] = true; // 큐에 추가할 때 방문 처리
                }
            }
        }
        return result.toString().trim();
    }
}

'Algorithm' 카테고리의 다른 글

1707. 이분 그래프  (1) 2025.01.24
2667. 단지 번호 붙이기  (1) 2025.01.23
2470. 두 용액  (1) 2025.01.17
2343. 기타 레슨  (0) 2025.01.17
1654. 랜선 자르기  (0) 2025.01.15

관련글 더보기