BaekJoon

[Baekjoon] 18352번 특정 거리의 도시 찾기 (Java) 문제 풀이 [Sliver 2]

Tenacity_Dev 2024. 3. 31. 18:49
728x90

문제

https://www.acmicpc.net/problem/18352

 

18352번: 특정 거리의 도시 찾기

첫째 줄에 도시의 개수 N, 도로의 개수 M, 거리 정보 K, 출발 도시의 번호 X가 주어진다. (2 ≤ N ≤ 300,000, 1 ≤ M ≤ 1,000,000, 1 ≤ K ≤ 300,000, 1 ≤ X ≤ N) 둘째 줄부터 M개의 줄에 걸쳐서 두 개

www.acmicpc.net

 

어떻게 풀 것인가?

특정 최단경로의 거리를 묻는 문제이다. 다익스트라를 이용하여 문제를 풀 수도 있지만, 나는 간단하게 BFS로 문제를 해결하였다.

 

최단경로를 묻는 것이 아닌 특정 최단경로의 거리를 묻는 것이기 때문에 그래프적 접근이 훨씬 좋다고 생각하였다.

 

풀면서 놓쳤던점

X

 

이 문제를 통해 얻어갈 것

BFS의 사용법

 

내 코드 

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        int k = sc.nextInt();
        int x = sc.nextInt();

        ArrayList<ArrayList<Integer>> graph = new ArrayList<>();
        for (int i = 0; i <= n; i++) {
            graph.add(new ArrayList<Integer>());
        }

        boolean[] chk = new boolean[n + 1]; // 방문 기록
        int[] distance = new int[n + 1]; // 이동 거리 배열

        for (int i = 0; i < m; i++) {
            int a = sc.nextInt();
            int b = sc.nextInt();
            graph.get(a).add(b);
        }

        ArrayList<Integer> result = new ArrayList<>(); // 결과를 담을 리스트

        // BFS 함수
        bfs(graph, chk, distance, x, k, result);

        if (result.isEmpty()) {
            System.out.println(-1);
        } else {
            Collections.sort(result);
            for (int i : result) {
                System.out.println(i);
            }
        }
    }

    public static void bfs(ArrayList<ArrayList<Integer>> graph, boolean[] chk, int[] distance, int start, int k, ArrayList<Integer> result) {
        Queue<Integer> q = new LinkedList<>();
        q.add(start);
        chk[start] = true;

        while (!q.isEmpty()) {
            int now = q.poll();
            for (int i : graph.get(now)) {
                if (!chk[i]) {
                    chk[i] = true;
                    distance[i] = distance[now] + 1;
                    q.add(i);
                    if (distance[i] == k) {
                        result.add(i);
                    }
                }
            }
        }
    }
}

 

참고

X

728x90