본문 바로가기
Beakjoon&프로그래머스/Java

[백준/Java] 24445번 알고리즘 수업 - 너비 우선 탐색 2

by 현장 2026. 1. 2.

-Code

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

public class BOJ24445 {
    static boolean[] visited;
    static int[] answer;
    static ArrayList<ArrayList<Integer>> graph;
    static int counter = 1;
    
    public static void main(String[] args) throws IOException {
        BufferedReader br =
                new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        
        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());
        int r = Integer.parseInt(st.nextToken());
        // visited와 answer 크기 셋팅
        visited = new boolean[n + 1];
        answer = new int[n + 1];
        // graph 셋팅
        graph = new ArrayList<>();
        for (int i = 0; i <= n; i++) {
            graph.add(new ArrayList<>());
        }
        // 정점 u, v 입력 받기
        for (int i = 0; i < m; i++) {
            st = new StringTokenizer(br.readLine());
            int u = Integer.parseInt(st.nextToken());
            int v = Integer.parseInt(st.nextToken());
            // 무방향 그래프 셋팅
            graph.get(u).add(v);
            graph.get(v).add(u);
        }
        // node의 nextNode들 내림차순 정렬
        for (ArrayList<Integer> nexts : graph) {
            nexts.sort(Comparator.reverseOrder());
        }
        // bfs 시작
        bfs(r);
        // 출력
        StringBuilder sb = new StringBuilder();
        for (int i = 1; i <= n; i++) {
            sb.append(answer[i]).append("\n");
        }
        System.out.println(sb);
    }

    private static void bfs(int node) {
        // 첫노드 방문 순서 입력 및 방문 체크
        answer[node] = counter++;
        visited[node] = true;
        // 덱 선언 및 첫 노드 담기
        Deque<Integer> dq = new ArrayDeque<>();
        dq.addLast(node);
        // 덱이 빌때까지 반복
        while (!dq.isEmpty()) {
            // 현재 노드 꺼내기
            int nowNode = dq.pollFirst();
            // 현재 노드의 다음 노드들 탐색
            for (int next : graph.get(nowNode)) {
                // 방문 여부 확인
                if (!visited[next]) {
                    // 다음 노드의 방문 순서 및 방문 체크
                    answer[next] = counter++;
                    visited[next] = true;
                    // 덱에 담아 꺼내서 탐색하도록 함
                    dq.addLast(next);
                }
            }
        }
    }
}