๊ธฐ๋ก๋ฐฉ

BOJ_11779 : ์ตœ์†Œ๋น„์šฉ ๊ตฌํ•˜๊ธฐ 2 ๋ณธ๋ฌธ

CodingTest/Java

BOJ_11779 : ์ตœ์†Œ๋น„์šฉ ๊ตฌํ•˜๊ธฐ 2

Soom_1n 2024. 3. 2. 17:12

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

 

11779๋ฒˆ: ์ตœ์†Œ๋น„์šฉ ๊ตฌํ•˜๊ธฐ 2

์ฒซ์งธ ์ค„์— ๋„์‹œ์˜ ๊ฐœ์ˆ˜ n(1≤n≤1,000)์ด ์ฃผ์–ด์ง€๊ณ  ๋‘˜์งธ ์ค„์—๋Š” ๋ฒ„์Šค์˜ ๊ฐœ์ˆ˜ m(1≤m≤100,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์…‹์งธ ์ค„๋ถ€ํ„ฐ m+2์ค„๊นŒ์ง€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฒ„์Šค์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋จผ์ € ์ฒ˜์Œ์—๋Š” ๊ทธ ๋ฒ„์Šค

www.acmicpc.net



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

  • n๊ฐœ์˜ ๋…ธ๋“œ์™€ m๊ฐœ์˜ ๋‹จ๋ฐฉํ–ฅ ๊ฐ„์„  ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.
  • ์‹œ์ž‘ ๋…ธ๋“œ๋ถ€ํ„ฐ ๋ชฉ์ ์ง€ ๋…ธ๋“œ๊นŒ์ง€์˜ ๊ฒฝ๋กœ ์ค‘ ๋น„์šฉ์ด ์ตœ์†Œ๊ฐ’์ด ๋˜๋Š” ๊ฒฝ๋กœ๋ฅผ ์ฐพ์•„, ๋น„์šฉ๊ณผ ๊ฒฝ๋กœ ์ƒ์˜ ๋…ธ๋“œ ์ˆ˜ ๋ฐ ๊ฒฝ๋กœ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
    • ๊ฐ™์€ ์ตœ์†Œ๊ฐ’์ด๋ฉด์„œ ๋‹ค๋ฅธ ๊ฒฝ๋กœ์ผ ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋ชจ๋‘ ์ •๋‹ต์œผ๋กœ ์ธ์ •๋œ๋‹ค.

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

  • ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์ตœ๋‹จ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•œ๋‹ค.
  • ๋น„์šฉ์˜ ์ตœ์†Œ๊ฐ’ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ตœ๋‹จ๊ฒฝ๋กœ๋ฅผ ์ถœ๋ ฅํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ๊ฐ’์ด ๊ฒฝ์‹ ๋  ๋•Œ ์ด์ „ ์ถœ๋ฐœ ๋…ธ๋“œ์˜ ๋ฒˆํ˜ธ๋ฅผ ์ €์žฅํ•œ๋‹ค.
  • ๋ชจ๋“  ๊ณ„์‚ฐ ์ดํ›„, ์ตœ์ข… ๋ชฉ์ ์ง€ ๋…ธ๋“œ๋ถ€ํ„ฐ ์‹œ์ž‘ ๋…ธ๋“œ๋กœ ์—ญํ–‰ํ•˜๋ฉฐ ๊ฒฝ๋กœ๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค.
  • ์ตœ์†Œ ๋น„์šฉ, ๊ฒฝ๋กœ ์ƒ์˜ ๋…ธ๋“œ ์ˆ˜, ๊ฒฝ๋กœ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

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

import java.io.*;
import java.util.ArrayList;
import java.util.PriorityQueue;
import java.util.Stack;
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));
        StringTokenizer st = null;
        StringBuilder sb = new StringBuilder();

        int n = Integer.parseInt(br.readLine());
        int m = Integer.parseInt(br.readLine());

        ArrayList<Edge>[] adjlist = new ArrayList[n + 1];
        Edge[] node = new Edge[n + 1];

        for (int i = 1; i <= n; i++) {
            node[i] = new Edge(0, i, Integer.MAX_VALUE);
            adjlist[i] = new ArrayList<>();
        }

        for (int i = 0; i < m; i++) {
            st = new StringTokenizer(br.readLine());
            int start = Integer.parseInt(st.nextToken());
            int end = Integer.parseInt(st.nextToken());
            int cost = Integer.parseInt(st.nextToken());
            adjlist[start].add(new Edge(start, end, cost));
        }

        st = new StringTokenizer(br.readLine());
        int first = Integer.parseInt(st.nextToken());
        int last = Integer.parseInt(st.nextToken());

        PriorityQueue<Edge> pq = new PriorityQueue<>();
        pq.add(new Edge(0, first, 0));

        while (!pq.isEmpty()) {
            Edge edge = pq.poll();

            if (edge.cost < node[edge.end].cost) {
                node[edge.end] = edge;
            } else continue;

            for (Edge e : adjlist[edge.end]) {
                if (edge.cost + e.cost < node[e.end].cost) {
                    pq.add(new Edge(e.start, e.end, e.cost + edge.cost));
                }
            }
        }

        sb.append(node[last].cost).append('\n');

        int now = last;
        Stack<Integer> stack = new Stack<>();
        stack.push(now);

        while (now != first) {
            now = node[now].start;
            stack.push(now);
        }

        sb.append(stack.size()).append('\n');

        while (!stack.isEmpty()) {
            sb.append(stack.pop()).append(' ');
        }

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

    private static class Edge implements Comparable<Edge> {
        int start;
        int end;
        int cost;

        public Edge(int start, int end, int cost) {
            this.start = start;
            this.end = end;
            this.cost = cost;
        }

        @Override
        public int compareTo(Edge o) {
            return this.cost - o.cost;
        }
    }
}

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

  • ์‹œ์ž‘ ๋…ธ๋“œ, ๋„์ฐฉ ๋…ธ๋“œ, ๋น„์šฉ์„ ์ €์žฅํ•˜๊ณ  ํ™œ์šฉํ•  Edge ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•œ๋‹ค.
  • ArrayList ๋ฐฐ์—ด์ธ adjlist์— ๋…ธ๋“œ ๋ณ„ ๊ฒฝ๋กœ๋ฅผ Edge๋กœ ์ž…๋ ฅ๋ฐ›์•„ ์ €์žฅํ•œ๋‹ค.
  • ๊ฐ ๋…ธ๋“œ์˜ ์ตœ์†Œ ๋น„์šฉ์€ Edge ๋ฐฐ์—ด์ธ node์— ์ €์žฅํ•œ๋‹ค.
  • ์šฐ์„ ์ˆœ์œ„ ํ์— 1๋ฒˆ๋…ธ๋“œ๋ฅผ ๋„ฃ๋Š” ๊ฒƒ์„ ์‹œ์ž‘์œผ๋กœ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‹คํ–‰ํ•œ๋‹ค.
    • ์šฐ์„ ์ˆœ์œ„ ํ์—์„œ ๋‚˜์˜จ ๋น„์šฉ์ด ํ˜„์žฌ ์ €์žฅ๋œ ์ตœ์†Œ๊ฐ’ ๋ณด๋‹ค ์ž‘์œผ๋ฉด, ๊ฐ’์„ ๊ฐฑ์‹ ํ•œ๋‹ค.
    • ๊ฐฑ์‹ ๋˜์ง€ ์•Š์œผ๋ฉด ๋‹ค์Œ ์›์†Œ๋ฅผ ํ™•์ธํ•˜๊ณ , ๊ฐฑ์‹ ๋˜์—ˆ์œผ๋ฉด ์—ฐ๊ฒฐ๋œ ๊ฒฝ๋กœ๋ฅผ ๋‹ค์‹œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ์šฐ์„ ์ˆœ์œ„ ํ์— ๋„ฃ๋Š”๋‹ค.
  • ๋ชจ๋“  ๊ณ„์‚ฐ์ด ๋๋‚œ ํ›„, ์ตœ์ข…์œผ๋กœ ๊ณ„์‚ฐ๋œ ์ตœ์†Œ ๋น„์šฉ, ๊ฒฝ๋กœ ์ˆ˜, ๊ฒฝ๋กœ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
    • ๊ฒฝ๋กœ๋Š” Stack์— ๋‹ด์œผ๋ฉฐ ์—ญ์ˆœํšŒ ํ•˜๋‹ค๊ฐ€, ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ๋งŒ๋‚˜๋ฉด Stack์›์†Œ๋ฅผ ๊บผ๋‚ด๋ฉฐ Stringbuilder์— ๋‹ด์•„ ์ถœ๋ ฅํ•œ๋‹ค.

๐Ÿ”ธ end ๐Ÿ”ธ

  • 45๋ฒˆ์งธ ์ค„์— else continue ๋ถ€๋ถ„์„ ์“ฐ์ง€ ์•Š์•„์„œ, ๊ฐฑ์‹ ๋˜์ง€ ์•Š์€ ๋…ธ๋“œ๋„ ๋‹ค์‹œ ํƒ์ƒ‰ํ•˜๊ฒŒ ๋˜์—ˆ๋”๋‹ˆ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋‚ฌ๋‹ค.
    • ์ด  ํšจ์œจ์„ฑ ๋ถ€๋ถ„์„ ์ƒ๊ฐํ•˜๊ธด ํ–ˆ๋Š”๋ฐ, ์ง‘์ค‘์ด ํ๋ ค์ ธ์„œ ๋ˆ„๋ฝํ•˜๊ณ  ๋„˜์–ด๊ฐ”๋˜ ๊ฒƒ ๊ฐ™๋‹ค.
    • ์›๋ž˜ ์ด์ „ ๋…ธ๋“œ๋ฅผ ์ €์žฅํ•˜๊ณ , ์—ญ์ˆœํšŒ ํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ํ, Stringbuilder, Arraylist๋ฅผ ์ƒ๊ฐํ–ˆ๋‹ค๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ„ฐ์งˆ ๊ฒƒ ๊ฐ™์•„ ๊ณ ๋ฏผํ•˜๋‹ค ๋ณด๋‹ˆ ์ง‘์ค‘์ด ํ๋ ค์กŒ๋‹ค.
    • ๊ฒฐ๊ณผ๋Š” ์ด์ „ ๋…ธ๋“œ ์ €์žฅ์ด๋ผ๋Š” ๊ฐ„๋‹จํ•œ ์†”๋ฃจ์…˜์œผ๋กœ ๋‚˜์™”๋‹ค. ๊ทธ๋ž˜๋„ ๋‹ค์‹œ ํ•œ๋ฒˆ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ ๊ฒ€ํ•˜๋Š” ๋ฒ„๋ฆ‡์„ ๋“ค์ด์ž.

 

728x90