우보천리 개발

[BJ] 18352 특정 거리의 도시 찾기 Java 본문

알고리즘/백준

[BJ] 18352 특정 거리의 도시 찾기 Java

밥은답 2023. 1. 26. 21:08
반응형

백준 18352 특정 거리의 도시 찾기

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 알고리즘을 활용하여 시작 도시와 인접한 도시까지의 거리를 구하며 계속 거리를 구해나간다
  • 방문 배열을 만들어 거리를 업데이트한다
  • 처음 거리는 0이고 그 이후 거리는 1만큼 늘어나기 때문에 이전 값에서 +1 해준 값으로 갱신해준다

코드

package baekjoon;
import java.util.*;

class BJ18352 {
    static int[] visited;
    static ArrayList<ArrayList<Integer>> graph = new ArrayList<>();
    static int n,k,x,m;
    static int count;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt(); // 도시 개수
        m = sc.nextInt(); // 도로 개수
        k = sc.nextInt(); // 거리 정보
        x = sc.nextInt(); // 시작 도시

        // 그래프 초기화
        for (int i=0; i<=n; i++) {
            graph.add(new ArrayList<>());
        }

        // 방문배열 초기화
        visited = new int[n+1];
        for (int i=0; i<=n; i++) {
            visited[i] = -1;
        }

        // 도시 정보 입력받기
        // 단방향
        for (int i=0; i<m; i++) {
            int a = sc.nextInt();
            int b = sc.nextInt();
            graph.get(a).add(b);
        }

        BFS(x);

        boolean flag = false;
        // 방문배열의 인덱스에는 도시별 거리가 저장되기 때문에
        // k만큼의 거리인 인덱스를 찾으면 됨
        for (int i=1; i<=n; i++) {
            if (visited[i] == k) {
                System.out.println(i);
                flag = true;
            }
        }
        if (!flag) System.out.println("-1");

    }

    public static void BFS(int start) {
        // 시작도시에서 시작도시까지의 거리는 0이다. (1 -> 1로 가는 거리는 0)
        visited[start] = 0;
        Queue<Integer> q = new LinkedList<>();
        q.offer(start); // 시작 도시를 큐에넣으며 시작

        while (!q.isEmpty()) {
            int cv = q.poll();
            // 현재 도시와 인접한 도시들에 대해서
            // 방문한적이 없는경우 (즉 -1)이면 방문하고, 현재 도시에서 +1 해준 값으로
            // 거리를 업데이트한다.
            for (int i : graph.get(cv)) {
                if (visited[i] == -1) {
                    visited[i] = visited[cv] + 1;
                    q.offer(i);
                }
            }
        }

    }
}
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[BJ] 7576 토마토 Java  (0) 2023.01.29
[BJ] 1325 효율적인 해킹 Java  (0) 2023.01.26
[BJ] 1744 수 묶기 Java  (0) 2023.01.26
[BJ] 1715 카드 정렬하기 Java  (0) 2023.01.25
[BJ] 1931 회의실 배정 Java  (0) 2023.01.25
Comments