[Boj_5214] ํ™˜์Šน

๐Ÿ“Ž ๋ฌธ์ œ ๋งํฌ

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

 

โ–ธ ๋ฌธ์ œ

์•„์ฃผ ๋จผ ๋ฏธ๋ž˜์— ์‚ฌ๋žŒ๋“ค์ด ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์ค‘๊ตํ†ต์€ ํ•˜์ดํผํŠœ๋ธŒ์ด๋‹ค. ํ•˜์ดํผํŠœ๋ธŒ ํ•˜๋‚˜๋Š” ์—ญ K๊ฐœ๋ฅผ ์„œ๋กœ ์—ฐ๊ฒฐํ•œ๋‹ค. 1๋ฒˆ์—ญ์—์„œ N๋ฒˆ์—ญ์œผ๋กœ ๊ฐ€๋Š”๋ฐ ๋ฐฉ๋ฌธํ•˜๋Š” ์ตœ์†Œ ์—ญ์˜ ์ˆ˜๋Š” ๋ช‡ ๊ฐœ์ผ๊นŒ?

 

โ–ธ ์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์—ญ์˜ ์ˆ˜ N๊ณผ ํ•œ ํ•˜์ดํผํŠœ๋ธŒ๊ฐ€ ์„œ๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ์—ญ์˜ ๊ฐœ์ˆ˜ K, ํ•˜์ดํผํŠœ๋ธŒ์˜ ๊ฐœ์ˆ˜ M์ด ์ฃผ์–ด์ง„๋‹ค. (1 ≤ N ≤ 100,000, 1 ≤ K, M ≤ 1000)

๋‹ค์Œ M๊ฐœ ์ค„์—๋Š” ํ•˜์ดํผํŠœ๋ธŒ์˜ ์ •๋ณด๊ฐ€ ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ์ฃผ์–ด์ง„๋‹ค. ์ด K๊ฐœ ์ˆซ์ž๊ฐ€ ์ฃผ์–ด์ง€๋ฉฐ, ์ด ์ˆซ์ž๋Š” ๊ทธ ํ•˜์ดํผํŠœ๋ธŒ๊ฐ€ ์„œ๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ์—ญ์˜ ๋ฒˆํ˜ธ์ด๋‹ค.

 

โ–ธ ์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— 1๋ฒˆ์—ญ์—์„œ N๋ฒˆ์—ญ์œผ๋กœ ๊ฐ€๋Š”๋ฐ ๋ฐฉ๋ฌธํ•˜๋Š” ์—ญ์˜ ๊ฐœ์ˆ˜์˜ ์ตœ์†Ÿ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค. ๋งŒ์•ฝ, ๊ฐˆ ์ˆ˜ ์—†๋‹ค๋ฉด -1์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด

  • ๐Ÿฅ‡  ๋ฌธ์ œ ๋ ˆ๋ฒจ : ๊ณจ๋“œ 2
  • ๐Ÿ””  ๋ฌธ์ œ ์œ ํ˜• : ๊ทธ๋ž˜ํ”„ ์ด๋ก , ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰, ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰
  • ๐Ÿ’ฌ  ํ’€์ด ์–ธ์–ด : JAVA

 

๐Ÿค” ๋ฌธ์ œ ํ’€์ด

๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰(BFS)๊ณผ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ํ™œ์šฉํ•˜์—ฌ,

ํ•˜์ดํผ ํŠœ๋ธŒ๋ฅผ ํ™˜์Šน์—ญ ๊ฐœ๋…์œผ๋กœ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ด๋‹ค.

 

๊ฐ ํ•˜์ดํผ ํŠœ๋ธŒ๋Š” k๊ฐœ์˜ ์—ญ์„ ์ง์ ‘ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ํ•˜์ดํผ ํŠœ๋ธŒ ๋…ธ๋“œ๋ฅผ ํ•˜๋‚˜์˜ ํ™˜์Šน์—ญ์œผ๋กœ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ฐ ์—ญ๊ณผ ์—ฐ๊ฒฐํ•œ๋‹ค.

 

์˜ˆ์ œ ์ž…๋ ฅ 1์„ ๊ทธ๋ฆผ์œผ๋กœ ๊ทธ๋ ค๋ณธ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด, ํ•˜์ดํผ ํŠœ๋ธŒ ๋…ธ๋“œ๋ฅผ ์ง€๋‚  ๋•Œ๋Š” ์ด๋™ ๊ฑฐ๋ฆฌ๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค์ง€ ์•Š๊ณ , ์‹ค์ œ ์—ญ์„ ์ง€๋‚  ๋•Œ๋งŒ ์ด๋™ ๊ฑฐ๋ฆฌ๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๋Š” ๋ฐฉ์‹์œผ๋กœ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ทธ๋ฆผ์„ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด, ์‹ค์ œ ์—ญ๋ผ๋ฆฌ๋Š” ์ง์ ‘ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์ง€ ์•Š๊ณ , ํ•˜์ดํผ ํŠœ๋ธŒ ๋…ธ๋“œ์™€ ์—ญ ๋…ธ๋“œ๋ผ๋ฆฌ๋งŒ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ 1๋ฒˆ ์—ญ์—์„œ N๋ฒˆ ์—ญ์œผ๋กœ ์ด๋™ํ•  ๋•Œ, ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ๊ฐ€์žฅ ๋จผ์ € ๋„์ฐฉํ•œ ๋…ธ๋“œ๊ฐ€ ์ตœ๋‹จ ๊ฒฝ๋กœ๊ฐ€ ๋œ๋‹ค.

 

์œ„ ํ’€์ด๋ฅผ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•ด ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

โœ” ์ตœ์ข… ์ฝ”๋“œ

๋ฉ”๋ชจ๋ฆฌ : 165668KB
์‹œ๊ฐ„ : 764ms
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {
    static int n, k, m;
    static ArrayList<ArrayList<Integer>> list;
    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()); // ํ•˜์ดํผํŠœ๋ธŒ ๊ฐœ์ˆ˜

        list = new ArrayList<>();
        // 1~n ์—ญ, n+1~m ํ•˜์ดํผํŠœ๋ธŒ
        for (int i = 0; i <= n+m; i++) {
            list.add(new ArrayList<>());
        }
        int hyperTube, node;
        for (int i = 1; i <= m; i++) {
            st = new StringTokenizer(br.readLine());
            hyperTube = n+i;
            for (int j = 0; j < k; j++) {
                node = Integer.parseInt(st.nextToken());
                list.get(node).add(hyperTube);
                list.get(hyperTube).add(node);
            }
        }

        int ans = bfs(1);

        System.out.println(ans);
    }

    private static int bfs(int start) {
        Queue<Integer> que = new LinkedList<>();
        int[] checked = new int[n+m+1]; // ๊ฑฐ์ณ๊ฐ„ ํšŸ์ˆ˜ ๊ธฐ๋ก

        que.offer(start);
        checked[start] = 1;

        while (!que.isEmpty()) {
            Integer now = que.poll();

            if (now == n) { // n๋ฒˆ์งธ ๋„์ฐฉ
                return checked[now];
            }

            for (Integer next : list.get(now)) {
                if (checked[next] == 0) { // ๋ฐฉ๋ฌธ X
                    // ํ•˜์ดํผํŠœ๋ธŒ ๋…ธ๋“œ๋กœ ๊ฐˆ ๋• ์ด๋™๊ฑฐ๋ฆฌ๋ฅผ ๋Š˜๋ฆฌ์ง€ ์•Š๊ณ , 
                    // ์‹ค์ œ ๋…ธ๋“œ๋กœ ๊ฐˆ ๋•Œ์—๋งŒ ์ด๋™๊ฑฐ๋ฆฌ๋ฅผ ๋Š˜๋ฆฐ๋‹ค.
                    if (next <= n) { // ์—ญ
                        checked[next] = checked[now]+1;
                    } else { // ํ•˜์ดํผํŠœ๋ธŒ
                        checked[next] = checked[now];
                    }
                    que.offer(next);
                }
            }
        }

        return -1;
    }
}

 

์ถ”์ฒœ๋ฐ›์•„ ํ’€์—ˆ๋˜ ๋ฌธ์ œ์ธ๋ฐ, ์ตœ๊ทผ์— ๋‹ค์‹œ ํ’€๋ฉด์„œ ๊ทธ๋ž˜ํ”„ ๋ฌธ์ œ ์ค‘์—์„œ๋„ ์‹ ์„ ํ•˜๊ณ  ์ƒˆ๋กœ์šด ๋ฌธ์ œ ๊ฐ™์•„์„œ ํฌ์ŠคํŒ…ํ•ด ๋ณธ๋‹ค !
์ฒ˜์Œ ํ’€ ๋•Œ, ์•„์ด๋””์–ด๊ฐ€ ๋– ์˜ค๋ฅด์ง€ ์•Š์•„ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์•„์ด๋””์–ด๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ํ•ด๊ฒฐํ–ˆ๋˜ ๊ธฐ์–ต์ด ์žˆ๋‹ค.

๊ทธ๋•Œ ๋‹น์‹œ์—๋Š” ํ’€์ด๋ฅผ ๋ด๋„ ์–ด๋ ต๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ, ์ด๋ฒˆ์—๋Š” ๊ทธ๋•Œ๋ณด๋‹ค ์ˆœ์กฐ๋กญ๊ฒŒ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์–ด ๋ฟŒ๋“ฏํ–ˆ๋‹ค. ๐Ÿ˜Šโญ

 

 

 

 

 

๐Ÿ“ƒ reference