๊ธฐ๋ก๋ฐฉ

BOJ_11657 : ํƒ€์ž„๋จธ์‹  ๋ณธ๋ฌธ

CodingTest/Java

BOJ_11657 : ํƒ€์ž„๋จธ์‹ 

Soom_1n 2024. 5. 11. 15:28

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



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

  • N๊ฐœ์˜ ๋„์‹œ์™€ M๊ฐœ์˜ ๋ฒ„์Šค๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. 1๋ฒˆ ๋„์‹œ์—์„œ ๋‚˜๋จธ์ง€ ๋„์‹œ๋กœ ๊ฐ€๋Š” ์ตœ๋‹จ ์‹œ๊ฐ„์„ ์ถœ๋ ฅํ•œ๋‹ค.
  • ๋ฒ„์Šค๋Š” ์‹œ์ž‘ ๋„์‹œ, ๋„์ฐฉ ๋„์‹œ, ์ด๋™ ์‹œ๊ฐ„์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.
  • ์ด๋™ ์‹œ๊ฐ„์€ ์ •์ˆ˜๋กœ ์ฃผ์–ด์ง„๋‹ค.

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

  • ๊ทธ๋ž˜ํ”„์—์„œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๊ณ , ์Œ์˜ ๊ฐ€์ค‘์น˜๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ๋ฒจ๋งŒ ํฌ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•œ๋‹ค.
  • N๋ฒˆ ๋งˆ๋‹ค M๊ฐœ์˜ ๊ฐ„์„ ์„ ๋ชจ๋‘ ๊ฒ€์‚ฌํ•˜๋ฏ€๋กœ, ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(NM)์ด๋‹ค.
  • ์ด๋™ ์‹œ๊ฐ„์˜ ์ตœ๋Œ€๊ฐ’์€ 499 * 10,000 ์œผ๋กœ, ์•ฝ 5,000,000 ๊นŒ์ง€ ์ปค์ง€๋ฏ€๋กœ intํ˜•์œผ๋กœ ์ฒ˜๋ฆฌ ๋œ๋‹ค.
    (๋…ธ๋“œ๊ฐ€ ์ผ๋ ฌ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๊ณ , ์—์ง€์˜ ์ตœ๋Œ€ ๊ฐ’์ธ 10,000์œผ๋กœ๋งŒ ์—ฐ๊ฒฐ ๋œ ๊ฒฝ์šฐ)
  • ์ด๋™ ์‹œ๊ฐ„์˜ ์ตœ์†Œ๊ฐ’์€ 500 * 6,000 * -10,000 ์œผ๋กœ, -3,000,000,000(-30์–ต) ๊นŒ์ง€ ์ปค์ง€๋ฏ€๋กœ intํ˜•์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๊ธฐ ๋•Œ๋ฌธ์— long์˜ ์ž๋ฃŒํ˜•์ด ํ•„์š”ํ•˜๋‹ค.
    (์Œ์ˆ˜ ์‚ฌ์ดํด์ด ์žˆ์–ด์„œ N*M ๋™์•ˆ ๊ฐ€์ค‘์น˜์˜ ์ตœ์†Œ๊ฐ’์ธ -10,000์ด ๋ˆ„์ ๋œ ๊ฒฝ์šฐ)

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

import java.io.*;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        // Input
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());
        long[] dist = new long[N + 1];
        Edge[] edges = new Edge[M];

        for (int i = 1; i <= N; i++) {
            dist[i] = Integer.MAX_VALUE;
        }

        for (int i = 0; i < M; i++) {
            st = new StringTokenizer(br.readLine());
            edges[i] = new Edge(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
        }

        // Bellman-ford-moore
        dist[1] = 0;
        boolean minusCircle = false;
        for (int i = 1; i <= N; i++) {
            for (int j = 0; j < M; j++) {
                if (dist[edges[j].start] == Integer.MAX_VALUE) // ์—ฃ์ง€ ์‹œ์ž‘ ๋…ธ๋“œ๊ฐ€ ๋ฐฉ๋ฌธ ์ „(๋ฌดํ•œ๋Œ€)์ด๋ฉด ํ†ต๊ณผ
                    continue;
                if (dist[edges[j].end] > dist[edges[j].start] + edges[j].cost) {
                    dist[edges[j].end] = dist[edges[j].start] + edges[j].cost;
                    if (i == N) {
                        minusCircle = true;
                    }
                }
            }
        }

        // Output
        if (minusCircle)
            bw.write("-1");
        else {
            StringBuilder sb = new StringBuilder();
            for (int i = 2; i <= N; i++) {
                if (dist[i] == Integer.MAX_VALUE)
                    sb.append("-1");
                else
                    sb.append(dist[i]);
                sb.append('\n');
            }
            bw.write(sb.toString().stripTrailing());
        }
        bw.flush();
    }

    private static class Edge {
        int start, end, cost;

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

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

  • ๊ฐ„์„  ํ‘œํ˜„์„ ์œ„ํ•ด ์‹œ์ž‘ ๋…ธ๋“œ, ๋„์ฐฉ ๋…ธ๋“œ, ๊ฐ€์ค‘์น˜๋ฅผ ์ €์žฅํ•˜๋Š” Edge ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•ด ์‚ฌ์šฉํ–ˆ๋‹ค.
  • ๋ฒจ๋งŒ-ํฌ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•ด์„œ ์Œ์ˆ˜ ์‚ฌ์ดํด์ด ์žˆ์œผ๋ฉด -1, ์—†๋‹ค๋ฉด ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅํ–ˆ๋‹ค.

๐Ÿ”ธ end ๐Ÿ”ธ

  • ๋ฒจ๋งŒ-ํฌ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ณต์Šตํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๊ฐ€ ๋˜์–ด์„œ ํฌ์ŠคํŒ…์œผ๋กœ ์ •๋ฆฌํ–ˆ๋‹ค.
  • ์ตœ๋‹จ ๊ฑฐ๋ฆฌ์˜ ์ตœ๋Œ€ ์ตœ์†Œ๊ฐ’์„ ๊ณ„์‚ฐํ•ด๋ณด์ง€ ์•Š์•„์„œ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋กœ '์ถœ๋ ฅ ์ดˆ๊ณผ'๊ฐ€ ๋– ์„œ ํ‹€๋ ธ๋‹ค.
    • ์ฒ˜์Œ์—” ๋์— ๊ณต๋ฐฑ(' ')์ด ๋“ค์–ด๊ฐ€์„œ ํ‹€๋ ธ๋‚˜, strip์„ ๋„ฃ์–ด๋ดค์ง€๋งŒ ์—ฌ์ „ํ–ˆ๋‹ค.
    • ์งˆ๋ฌธํ•˜๊ธฐ๋ฅผ ๋ณด๋‹ˆ, ์ตœ์†Ÿ๊ฐ’์ด ์Œ์ˆ˜ ์‚ฌ์ดํด์„ ํƒ€๋ฉด -30์–ต๊นŒ์ง€ ๊ฐˆ ์ˆ˜ ์žˆ์–ด์„œ long์„ ์‚ฌ์šฉํ•ด์•ผ ํ–ˆ๋‹ค.
    • ์ตœ๋Œ€ ์ตœ์†Œ ์—ฃ์ง€์ผ€์ด์Šค๋ฅผ ๊ผญ ๋”ฐ์ ธ๋ณด๋Š” ์Šต๊ด€์„ ๋“ค์—ฌ์•ผ ๊ฒ ๋‹ค.
728x90