Algorithm/Baekjoon

[Java] λ°±μ€€ 5214번 - ν™˜μŠΉ

개발개꡴🐸 2022. 7. 18. 22:00

[문제]

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

 

5214번: ν™˜μŠΉ

첫째 쀄에 μ—­μ˜ 수 Nκ³Ό ν•œ ν•˜μ΄νΌνŠœλΈŒκ°€ μ„œλ‘œ μ—°κ²°ν•˜λŠ” μ—­μ˜ 개수 K, ν•˜μ΄νΌνŠœλΈŒμ˜ 개수 M이 주어진닀. (1 ≤ N ≤ 100,000, 1 ≤ K, M ≤ 1000) λ‹€μŒ M개 μ€„μ—λŠ” ν•˜μ΄νΌνŠœλΈŒμ˜ 정보가 ν•œ 쀄에 ν•˜λ‚˜μ”© μ£Όμ–΄

www.acmicpc.net

[풀이]

BFS(λ„ˆλΉ„ μš°μ„  탐색)을 μ΄μš©ν•˜μ—¬ ν’€μ΄ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

 

μž…λ ₯으둜 λ“€μ–΄μ˜€λŠ” μˆ«μžλ“€μ„ 2개둜 λ‚˜λˆ„μ–΄ μƒκ°ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

tubeOut 각 ν•˜μ΄ν”„νŠœλΈŒκ°€ 이동할 수 μžˆλŠ” μ—­ 번호

tubeIn 각 역듀이 이동할 수 μž‡λŠ” ν•˜μ΄ν”„νŠœλΈŒ 번호

 

λ”°λΌμ„œ μ˜ˆμ‹œ 1λ²ˆμ„ μ‚¬μš©ν•˜λ©΄ tubeOutκ³Ό tubeInλŠ” μ•„λž˜μ™€ 같이 κ΅¬μ„±λ©λ‹ˆλ‹€.

두 ArrayListλ₯Ό ν™œμš©ν•΄μ„œ findStation()λ₯Ό 톡해 BFSλ₯Ό μ§„ν–‰ν•˜λ©΄,

 

( μ΄λ•Œ N = 1이라면 무저건 1λ²ˆλ§Œμ— 역에 이동 κ°€λŠ₯ν•˜λ‹€λŠ” μ˜ˆμ™Έ 처리λ₯Ό ν•˜μ§€ λͺ»ν•΄ 100%μ—μ„œ μ˜€λ‹΅μ²˜λ¦¬κ°€ λ˜λŠ” λ¬Έμ œκ°€ λ°œμƒν–ˆμ—ˆμŠ΅λ‹ˆλ‹€. )

 

1번 μ—­ -> 2,3튜브둜 이동 κ°€λŠ₯ (  1번 이동 )

2번 μ—­ -> 1λ²ˆνŠœλΈŒλŠ” 이미 λ°©λ¬Έν–ˆμœΌλ‹ˆ continue

3λ²ˆμ—­ ->  3번 튜브둜 이동 κ°€λŠ₯ ( 2번 이동 )

 

3번 튜브 -> 3, 6, 7번 μ—­μœΌλ‘œ 이동 κ°€λŠ₯

3번 μ—­ -> 이미 λ°©λ¬Έ ν–ˆμœΌλ‹ˆ continue

6번 μ—­ -> 4, 5 튜브둜 이동 κ°€λŠ₯ ( 3번 이동 )

5번 νŠœλΈŒμ— Nμ˜κ°’ 9κ°€ μžˆμœΌλ―€λ‘œ  ( 4번 이동 ) 4λ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.

 

[μ½”λ“œ]

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

class Station implements Comparable<Station>{
    int index;
    int sum;
    public Station(int index, int sum) {
        this.index = index;
        this.sum = sum;
    }

    @Override
    public int compareTo(Station o) {
        return this.sum - o.sum;
    }
}

public class Main {
    public static int N; // μ—­μ˜ 개수
    public static int K; // ν•œ ν•˜μ΄νΌνŠœλΈŒκ°€ μ—°κ²°ν•˜λŠ” μ—­μ˜ 개수
    public static int M; // ν•˜μ΄νΌνŠœλΈŒμ˜ 개수
    public static ArrayList<ArrayList<Integer>> tubeOut = new ArrayList<>(); // 각 νŠœλΈŒκ°€ 갈 수 μžˆλŠ” μ—­ μ €μž₯
    public static ArrayList<ArrayList<Integer>> tubeIn = new ArrayList<>(); // 각 역이 갈 μˆ˜μžˆλŠ” 튜브 μ €μž₯
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        K = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());

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

        tubeOut.add(new ArrayList<Integer>());
        for(int i=1;i<=M;i++) {
            tubeOut.add(new ArrayList<Integer>());
            st = new StringTokenizer(br.readLine());
            for(int j=0;j<K;j++) {
                int num = Integer.parseInt(st.nextToken());
                tubeOut.get(i).add(num);
                tubeIn.get(num).add(i);
            }
        }
        findStation();
    }
    public static void findStation() {
        if(N == 1) {
            System.out.println(1);
            return;
        }
        
        PriorityQueue<Station> pq = new PriorityQueue<>();
        pq.offer(new Station(1, 1));

        boolean[] visitTube = new boolean[M + 1];
        boolean[] visitStation = new boolean[N + 1];

        while(!pq.isEmpty()) {
            Station p = pq.poll();
            visitStation[p.index] = true;
            for(Integer tube:tubeIn.get(p.index)) {
                if(visitTube[tube]) {
                    continue;
                }
                visitTube[tube] = true;
                for(Integer station:tubeOut.get(tube)) {
                    if(!visitStation[station]) {
                        visitStation[station] = true;
                        if(station == N) {
                            System.out.println(p.sum + 1);
                            return;
                        }
                        pq.offer(new Station(station, p.sum + 1));
                    }
                }
            }
        }
        System.out.println(-1);
    }
}