๊ธฐ๋ก๋ฐฉ

BOJ_1854 : K๋ฒˆ์งธ ์ตœ๋‹จ๊ฒฝ๋กœ ์ฐพ๊ธฐ ๋ณธ๋ฌธ

CodingTest/Java

BOJ_1854 : K๋ฒˆ์งธ ์ตœ๋‹จ๊ฒฝ๋กœ ์ฐพ๊ธฐ

Soom_1n 2024. 9. 26. 10:44

๐Ÿ‘‰ ๋ฌธ์ œ๋งํฌ


๐Ÿ”ธ ๋ฌธ์ œ ๋ถ„์„ ๐Ÿ”ธ

  • 1๋ฒˆ ๋„์‹œ๋ถ€ํ„ฐ ๋‹ค๋ฅธ ๋„์‹œ๋กœ ๊ฐ€๋Š” K๋ฒˆ์งธ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•ด์•ผ ํ•œ๋‹ค.
  • K๋ฒˆ์งธ ์ตœ๋‹จ ๊ฒฝ๋กœ๊ฐ€ ์—†์œผ๋ฉด -1 ์ถœ๋ ฅํ•œ๋‹ค.

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

  • ํ•œ ๋…ธ๋“œ๋ถ€ํ„ฐ ๋‹ค๋ฅธ ๋…ธ๋“œ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋ฏ€๋กœ, ๋‹ค์ต์ŠคํŠธ๋ผ (Dijkstra) ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์„ ํƒํ•œ๋‹ค.
  • ์ผ๋ฐ˜์ ์ธ ๋‹ค์ต์ŠคํŠธ๋ผ์™€ ๋‹ค๋ฅด๊ฒŒ, ๊ฑฐ๋ฆฌ๋ฅผ ์—…๋ฐ์ดํŠธ์ดํŠธ ํ•˜์ง€ ์•Š๊ณ  ์šฐ์„  ์ˆœ์œ„ ํ์— ๋‹ค์‹œ ๋„ฃ๋Š”๋‹ค.
  • ๋ฌดํ•œ ์ˆœํ™˜ ํ˜น์€ ๋„ˆ๋ฌด ๋งŽ์€ ์›์†Œ๊ฐ€ ์ƒ๊ธฐ์ง€ ์•Š๋„๋ก, K๊ฐœ ๊นŒ์ง€๋งŒ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•œ๋‹ค.

๐Ÿ”ธ ์ฝ”๋“œ ๐Ÿ”ธ

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

public class Main {
    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 = new StringTokenizer(br.readLine());

        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());
        int k = Integer.parseInt(st.nextToken());

        ArrayList<ArrayList<int[]>> adjList = new ArrayList<>();
        ArrayList<ArrayList<Integer>> dist = new ArrayList<>();

        for (int i = 0; i <= n; i++) {
            adjList.add(new ArrayList<>());
            dist.add(new ArrayList<>());
        }

        for (int i = 0; i < m; i++) {
            st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            int c = Integer.parseInt(st.nextToken());
            adjList.get(a).add(new int[]{b, c});
        }

        PriorityQueue<int[]> pq = new PriorityQueue<>(Comparator.comparingInt(a -> a[1]));

        pq.offer(new int[]{1, 0});

        while (!pq.isEmpty()) {
            int[] now = pq.poll();

            if (dist.get(now[0]).size() >= k) {
                continue;
            }

            dist.get(now[0]).add(now[1]);

            for (int[] a : adjList.get(now[0])) {
                pq.offer(new int[]{a[0], now[1] + a[1]});
            }
        }

        for (int i = 1; i <= n; i++) {
            if (dist.get(i).size() < k) {
                sb.append(-1).append('\n');
            } else {
                sb.append(dist.get(i).get(k - 1)).append('\n');
            }
        }

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

๐Ÿ”ธ ์ฝ”๋“œ ํ•ด์„ ๐Ÿ”ธ

  • ๊ฐ„์„  ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ adjList๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.
  • K๊ฐœ์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋ฆฌ์ŠคํŠธ dist๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.
  • ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฌธ ์ฒดํฌ ๋Œ€์‹ , ์ตœ๋‹จ ๊ฒฝ๋กœ์˜ ๊ฐœ์ˆ˜๊ฐ€ K๊ฐœ๊ฐ€ ๋˜์ง€ ์•Š์„ ๋•Œ ๊นŒ์ง€ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•œ๋‹ค.

๐Ÿ”ธ end ๐Ÿ”ธ

  • ํ”Œ๋ ˆํ‹ฐ๋„˜ ๋ฌธ์ œ๋ผ๊ณ  ๋งŽ์ด ๊ฑฑ์ •ํ–ˆ๋Š”๋ฐ, ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์กฐ๊ธˆ๋งŒ ๋ณ€ํ˜•ํ•˜๋ฉด ๋œ๋‹ค๋Š” ์•„์ด๋””์–ด๊ฐ€ ๋– ์˜ค๋ฅธ๋‹ค๋ฉด ๊ธˆ๋ฐฉ ํ’€๋ฆฌ๋Š” ๋ฌธ์ œ์˜€๋‹ค.
  • ๋‚˜๋Š” ์šฐ์„ ์ˆœ์œ„ ํ์—์„œ ๋‚˜์˜ค๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ํ•ด๋‹น ๋…ธ๋“œ๊นŒ์ง€ ๊ฐ€๋Š” 'ํ˜„์žฌ์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ'๋กœ ์ƒ๊ฐํ•˜๊ณ  ํ’€์ดํ–ˆ๋Š”๋ฐ, ์ด๊ฒŒ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ํ™•์‹คํžˆ ๋ณด์žฅํ•˜๋Š”์ง€๋Š” ์˜๋ฌธ์ด๋‹ค. (๋ฐฑ์ค€ ๊ฒŒ์‹œํŒ์— ์งˆ๋ฌธ์„ ๋‚จ๊ฒจ๋†จ๋‹ค.)
    • ๋‹ค๋ฅธ ํ’€์ด๋กœ dist๋ฅผ ๊ทธ๋ƒฅ ArrayList๊ฐ€ ์•„๋‹Œ ์šฐ์„  ์ˆœ์œ„ ํ์˜ ๋ฐฐ์—ด๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์—ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์—” ํ™•์‹คํžˆ K๋ฒˆ์งธ ๊ฑฐ๋ฆฌ๋ฅผ ๋ณด์žฅํ•œ๋‹ค.
  • ์ฝ”๋“œ๋ฅผ ๋‹ค๋“ฌ์œผ๋ฉฐ ์—ฌ๋Ÿฌ๋ฒˆ ์ œ์ถœํ–ˆ๋Š”๋ฐ, ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๊ฐ™์œผ๋‹ˆ ์‹œ๊ฐ„์ด๋‚˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋น„์Šทํ•˜๋‹ค. ๊ทผ์†Œํ•œ ์ˆ˜์น˜ ์ฐจ์ด๋Š” ๊ทธ๋ƒฅ ์„œ๋ฒ„ ์ƒํƒœ์˜ ์ฐจ์ด์ธ ๊ฒƒ ๊ฐ™๋‹ค.

728x90