본문 바로가기
PS/Baekjoon

[Baekjoon] 18352 - 특정 거리의 도시 찾기

by 서현 SEOHYEON 2023. 8. 14.

📝 문제

 

 

🔑 풀이 과정

· 그래프를 탐색하는 문제. BFS를 사용해서 풀이했다.

 

· 최단 거릿값을 저장하는 moves 배열을 사용했다. BFS를 사용해서 이전 도시의 최단 거릿값 + 1 을 moves 배열에 저장하는 방식을 사용했다.

 

· 탐색 완료 후, moves 배열을 전체탐색 하면서 K값과 같은 값이 존재하면, 그 인덱스를 answer 라는 이름의 ArrayList에 저장했다. 그 후 ArrayList의 크기가 0이면 -1을 출력하고, 요소가 존재한다면 그 요소들을 출력하게 했다.

 

· 주석을 보면 전체적인 과정이 이해갈 것이다.

 

 

 

🔓 답안

import java.io.*;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {

    static ArrayList<Integer>[] arrayList;
    static boolean[] visited;
    static int[] moves;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringBuilder sb = new StringBuilder();
        StringTokenizer st;

        //입력
        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()); //출발 도시의 번호

        //인접 리스트 선언
        arrayList = new ArrayList[N+1];
        for(int i = 0; i < arrayList.length; i++){
            arrayList[i] = new ArrayList<>();
        }

        //방문 배열 선언
        visited = new boolean[N+1];

        //이동 횟수를 넣을 배열 선언
        moves = new int[N+1];

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

            arrayList[a].add(b);
            //단방향도로 이므로 한쪽만 추가해준다.
        }

        //BFS 수행
        BFS(X);

        //moves탐색하면서, K와 같은 값을 가진 인덱스를 answer ArrayList에 넣는다.
        ArrayList<Integer> answer = new ArrayList<>();
        for(int i = 1; i <= N; i++){
            if(moves[i] == K)
                answer.add(i);
        }

        //answer 리스트가 비어있으면 -1 출력, 안 비어있으면 요소들 출력
        if(answer.size() == 0){
            sb.append(-1).append("\n");
        } else{
            for(int a : answer)
                sb.append(a).append("\n");
        }

        bw.write(sb.toString());
        bw.flush();
        bw.close();
    }

    static void BFS(int s){
        Queue<Integer> queue = new LinkedList<>();
        visited[s] = true;
        queue.add(s);

        while(!queue.isEmpty()){
            int now = queue.remove();

            for(int n : arrayList[now]){
                if(!visited[n]){
                    moves[n] = moves[now] + 1;
                    visited[n] = true;
                    queue.add(n);
                }
            }
        }

    }

}

 

 

 

🖤 알고리즘 분류

- 그래프 이론

- 그래프 탐색

- 너비 우선 탐색

- 데이크스트라

'PS > Baekjoon' 카테고리의 다른 글

[Baekjoon] 1758 - 알바생 강호  (0) 2023.08.16
[Baekjoon] 1325 - 효율적인 해킹  (0) 2023.08.15
[Baekjoon] 27323 - 직사각형  (0) 2023.08.13
[Baekjoon] 2847 - 게임을 만든 동준이  (0) 2023.08.12
[Baekjoon] 2583 - 영역 구하기  (0) 2023.08.11

댓글