[Boj_1446] ์ง€๋ฆ„๊ธธ

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

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

 

1446๋ฒˆ: ์ง€๋ฆ„๊ธธ

์ฒซ์งธ ์ค„์— ์ง€๋ฆ„๊ธธ์˜ ๊ฐœ์ˆ˜ N๊ณผ ๊ณ ์†๋„๋กœ์˜ ๊ธธ์ด D๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. N์€ 12 ์ดํ•˜์ธ ์–‘์˜ ์ •์ˆ˜์ด๊ณ , D๋Š” 10,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค. ๋‹ค์Œ N๊ฐœ์˜ ์ค„์— ์ง€๋ฆ„๊ธธ์˜ ์‹œ์ž‘ ์œ„์น˜, ๋„์ฐฉ ์œ„์น˜, ์ง€๋ฆ„๊ธธ์˜ ๊ธธ์ด

www.acmicpc.net

 

โ–ธ ๋ฌธ์ œ

๋งค์ผ ์•„์นจ, ์„ธ์ค€์ด๋Š” ํ•™๊ต์— ๊ฐ€๊ธฐ ์œ„ํ•ด์„œ ์ฐจ๋ฅผ ํƒ€๊ณ  Dํ‚ฌ๋กœ๋ฏธํ„ฐ ๊ธธ์ด์˜ ๊ณ ์†๋„๋กœ๋ฅผ ์ง€๋‚œ๋‹ค. ์ด ๊ณ ์†๋„๋กœ๋Š” ์‹ฌ๊ฐํ•˜๊ฒŒ ์ปค๋ธŒ๊ฐ€ ๋งŽ์•„์„œ ์ •๋ง ์šด์ „ํ•˜๊ธฐ๋„ ํž˜๋“ค๋‹ค. ์–ด๋А ๋‚ , ์„ธ์ค€์ด๋Š” ์ด ๊ณ ์†๋„๋กœ์— ์ง€๋ฆ„๊ธธ์ด ์กด์žฌํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. ๋ชจ๋“  ์ง€๋ฆ„๊ธธ์€ ์ผ๋ฐฉํ†ตํ–‰์ด๊ณ , ๊ณ ์†๋„๋กœ๋ฅผ ์—ญ์ฃผํ–‰ํ•  ์ˆ˜๋Š” ์—†๋‹ค.

์„ธ์ค€์ด๊ฐ€ ์šด์ „ํ•ด์•ผ ํ•˜๋Š” ๊ฑฐ๋ฆฌ์˜ ์ตœ์†Ÿ๊ฐ’์„ ์ถœ๋ ฅํ•˜์‹œ์˜ค.

 

โ–ธ ์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์ง€๋ฆ„๊ธธ์˜ ๊ฐœ์ˆ˜ N๊ณผ ๊ณ ์†๋„๋กœ์˜ ๊ธธ์ด D๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. N์€ 12 ์ดํ•˜์ธ ์–‘์˜ ์ •์ˆ˜์ด๊ณ , D๋Š” 10,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค. ๋‹ค์Œ N๊ฐœ์˜ ์ค„์— ์ง€๋ฆ„๊ธธ์˜ ์‹œ์ž‘ ์œ„์น˜, ๋„์ฐฉ ์œ„์น˜, ์ง€๋ฆ„๊ธธ์˜ ๊ธธ์ด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋ชจ๋“  ์œ„์น˜์™€ ๊ธธ์ด๋Š” 10,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์Œ์ด ์•„๋‹Œ ์ •์ˆ˜์ด๋‹ค. ์ง€๋ฆ„๊ธธ์˜ ์‹œ์ž‘ ์œ„์น˜๋Š” ๋„์ฐฉ ์œ„์น˜๋ณด๋‹ค ์ž‘๋‹ค.

 

โ–ธ ์ถœ๋ ฅ

์„ธ์ค€์ด๊ฐ€ ์šด์ „ํ•ด์•ผํ•˜๋Š” ๊ฑฐ๋ฆฌ์˜ ์ตœ์†Ÿ๊ฐ’์„ ์ถœ๋ ฅํ•˜์‹œ์˜ค.

 

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

  • ๐Ÿฅˆ ๋ฌธ์ œ ๋ ˆ๋ฒจ : ์‹ค๋ฒ„ 1
  • ๐Ÿ””  ๋ฌธ์ œ ์œ ํ˜• : ๊ทธ๋ž˜ํ”„ ์ด๋ก , ๋ฐ์ดํฌ์ŠคํŠธ๋ผ, ์ตœ๋‹จ ๊ฒฝ๋กœ
  • ๐Ÿ’ฌ  ํ’€์ด ์–ธ์–ด : JAVA

 

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

  • ์ง€๋ฆ„๊ธธ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ์— ์ €์žฅํ•ด ์ฃผ์—ˆ๋Š”๋ฐ,
  • ์ด๋•Œ ์ง€๋ฆ„๊ธธ์ด ๋ชฉํ‘œ์ง€์ ์„ ๋„˜์–ด์„œ๊ฑฐ๋‚˜(์—ญ์ฃผํ–‰ ๋ถˆ๊ฐ€), ๊ธฐ์กด ๊ธธ๋ณด๋‹ค ๊ฑฐ๋ฆฌ๊ฐ€ ๊ธด ๊ฒฝ์šฐ๋Š” ์ œ์™ธํ•˜๊ณ  ๋ฆฌ์ŠคํŠธ์— ์ €์žฅํ–ˆ๋‹ค.
  • dist ๋ฐฐ์—ด์—๋Š” ๊ฑฐ๋ฆฌ๋ฅผ ์‹œ์ž‘ ์ง€์ ์—์„œ 1์”ฉ ์ฆ๊ฐ€ํ•˜๋ฉฐ ํ•ด๋‹น ์ง€์ ์œผ๋กœ ๊ฐ€๋Š” ์ง€๋ฆ„๊ธธ์ด ์žˆ์„ ๋•Œ, ๋” ์งง๊ฒŒ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐฑ์‹ ํ–ˆ๋‹ค.

 

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

๋ฉ”๋ชจ๋ฆฌ : 12564KB
์‹œ๊ฐ„ : 92ms
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

public class Main {
    static int n, d;
    static ArrayList<ArrayList<pos>> list;
    static int[] dist;
    static boolean[] checked;
    static public class pos implements Comparable<pos> {
        int end; int dist;

        public pos(int end, int dist) {
            this.end = end;
            this.dist = dist;
        }

        @Override
        public int compareTo(pos o) {
            return this.dist - o.dist;
        }
    }
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(br.readLine());
        n = Integer.parseInt(st.nextToken()); // ์ง€๋ฆ„๊ธธ์˜ ๊ฐœ์ˆ˜
        d = Integer.parseInt(st.nextToken()); // ๊ณ ์†๋„๋กœ์˜ ๊ธธ์ด

        // ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ
        list = new ArrayList<>();
        for (int i = 0; i < 10001; i++) {
            list.add(new ArrayList<>());
        }

        // ์ถœ๋ฐœ์ง€์—์„œ ์ตœ์†Œ ๊ฑฐ๋ฆฌ ๊ธฐ๋ก
        dist = new int[d+1];
        Arrays.fill(dist, Integer.MAX_VALUE);

        for (int i = 0; i < n; i++) {
            st = new StringTokenizer(br.readLine());
            int start = Integer.parseInt(st.nextToken()); // ์‹œ์ž‘ ์œ„์น˜
            int end = Integer.parseInt(st.nextToken()); // ๋„์ฐฉ ์œ„์น˜
            int dist = Integer.parseInt(st.nextToken()); // ์ง€๋ฆ„๊ธธ์˜ ๊ฑฐ๋ฆฌ

            // ๋„์ฐฉ ์œ„์น˜๋Š” ๊ณ ์†๋„๋กœ์˜ ๊ธธ์ด๋ฅผ ๋„˜์œผ๋ฉด ์•ˆ๋จ, ์—ญ์ฃผํ–‰ ๋ถˆ๊ฐ€
            if (end > d) continue;
            // ์ง€๋ฆ„๊ธธ์ด ๋ชจ๋‘ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋Š” ์•„๋‹˜
            // 110 -> 140, 90์€ ์ง€๋ฆ„๊ธธ์ด ๋” ๋ฉ€์Œ
            // ์ง€๋ฆ„๊ธธ์ธ ๊ฒฝ์šฐ์—๋งŒ list ์ถ”๊ฐ€
            if (end - start > dist) {
                list.get(start).add(new pos(end, dist));
            }
        }

        dijkstra(0);

        bw.append(dist[d] + "\n");
        bw.flush();
        bw.close();
        br.close();
    }

    private static void dijkstra(int end) {
        PriorityQueue<pos> pq = new PriorityQueue<>();
        pq.offer(new pos(end, 0));
        checked = new boolean[d+1];
        dist[end] = 0;

        while (!pq.isEmpty()) {
            pos now = pq.poll();
            end = now.end;
            checked[end] = true;

            if (end == d) break; // ๋„์ฐฉ

            // ๊ฑฐ๋ฆฌ 1์”ฉ ์ฆ๊ฐ€
            if (dist[end+1] > now.dist+1) {
                dist[end+1] = now.dist+1;
                pq.offer(new pos(end+1, dist[end+1]));
            }

            // ํ•ด๋‹น ์ง€์ ์œผ๋กœ ๊ฐ€๋Š” ์ง€๋ฆ„๊ธธ์ด ์žˆ๋‹ค๋ฉด
            for (pos next : list.get(end)) {
                // ๊ฐ€์ค‘์น˜๊ฐ€ ๋” ์ž‘๋‹ค๋ฉด ๊ฐฑ์‹ 
                if (!checked[next.end] &&  dist[next.end] > dist[end] + next.dist) {
                    dist[next.end] = dist[end] + next.dist;
                    pq.offer(new pos(next.end, dist[next.end]));
                }
            }
        }
    }
}


 

 

๐Ÿ“ ํ•จ๊ป˜ ํ’€์–ด๋ณด๋ฉด ์ข‹์€ ๋ฐฑ์ค€ ๋ฌธ์ œ