자료구조 & 알고리즘/BOJ

[java] 백준 18352번 문제(특정 거리의 도시 찾기)

seungwook_TIL 2025. 4. 15. 09:25

원본 링크 : https://www.acmicpc.net/problem/18352


문제설명

 

 

소스코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Boj_18352
{
    static ArrayList<Integer>[] list; // 인접 리스트
    static int distanceArr[]; // 거리를 저장하는 배열

    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 k = Integer.parseInt(st.nextToken()); // 원하는 거리 수
        int x = Integer.parseInt(st.nextToken()); // 출발 노드

        list = new ArrayList[n + 1];
        for(int i = 1; i < n + 1; ++i) list[i] = new ArrayList<>();

        distanceArr = new int[n + 1];
        Arrays.fill(distanceArr, -1); // 거리를 -1로 초기화

        for(int i = 0; i < m; ++i)
        {
            st = new StringTokenizer(br.readLine());
            int from = Integer.parseInt(st.nextToken());
            int to = Integer.parseInt(st.nextToken());
            list[from].add(to); // from에서 to로 가는 경로 추가
        }

        bfs(x); // BFS 수행


        // 거리가 k인 도시 출력
        boolean found = false;
        for (int i = 1; i < n + 1; ++i)
        {
            if (distanceArr[i] == k)
            {
                System.out.println(i);
                found = true;
            }
        }

        if (!found) System.out.println(-1);

    }

    static void bfs(int startCity)
    {
        Queue<Integer> que = new LinkedList<>();
        distanceArr[startCity] = 0; // 시작 도시는 거리가 0
        que.add(startCity); // 큐에 시작 도시 추가
        while (!que.isEmpty()) // 큐가 비어있지 않다면
        {
            int currentCity = que.poll();
            for (int nextCity : list[currentCity]) // 인접 리스트에서 다음 도시를 가져옴
            {
                if (distanceArr[nextCity] == -1) // 거리가 정해지지 않았다면
                {
                    distanceArr[nextCity] = distanceArr[currentCity] + 1; // 다음 도시의 거리는 현재 도시의 거리 +1
                    que.offer(nextCity);
                }
            }
        }
    }
}

 

설명

  • 최단 거리를 구하라고 했으므로 BFS를 사용

 

 

이 케이스를 예로들면,

 

1. 인접 리스트로 도시와 도로 데이터의 그래프를 구현

 

2. BFS를 수행하면서 각 도시로 가는 최단 거릿값을 거리 배열에 저장

최초에는 방문 도시가 1이고, 이동하지 않았으므로 방문 배열에 0을 저장한다.

이후 방문하는 도시는 이전 도시의 거리 배열값 + 1을 거리 배열에 저장하는 방식으로 이동 거리를 저장한다.

 

3. 탐색 종료 후 거리 배열에 값이 K와 같은 도시의 번호를 출력