μ•Œκ³ λ¦¬μ¦˜/BOJ - Java

[BOJ/Java] 11404. ν”Œλ‘œμ΄λ“œ

ImJay 2025. 3. 10. 10:33
λ°˜μ‘ν˜•

πŸ“Œ [BOJ/Java] 11404. ν”Œλ‘œμ΄λ“œ


πŸ’‘ 문제 해석

N개의 λ„μ‹œκ°€ 있고, M개의 λ²„μŠ€ 노선이 μ‘΄μž¬ν•œλ‹€.
각 λ²„μŠ€λŠ” νŠΉμ •ν•œ λΉ„μš©μ΄ 있으며, λ„μ‹œ κ°„ μ΅œλ‹¨ λΉ„μš©μ„ κ΅¬ν•˜λŠ” λ¬Έμ œμ΄λ‹€.

πŸ”Ή μ£Όμ–΄μ§„ 정보

  • N: λ„μ‹œμ˜ 개수 (2 ≤ N ≤ 100)
  • M: λ²„μŠ€ λ…Έμ„ μ˜ 개수 (1 ≤ M ≤ 100,000)
  • A B C: A번 λ„μ‹œμ—μ„œ B번 λ„μ‹œλ‘œ κ°€λŠ” λΉ„μš©μ΄ C (쀑볡 κ°€λŠ₯)

βœ… λͺ©ν‘œ:
1️⃣ λͺ¨λ“  λ„μ‹œ 쌍(i → j)에 λŒ€ν•œ μ΅œμ†Œ λΉ„μš© 경둜λ₯Ό κ΅¬ν•˜κΈ°
2️⃣ κ²½λ‘œκ°€ μ—†λŠ” 경우 0을 좜λ ₯


πŸ“ 풀이 κ³Όμ •

1️⃣ ν”Œλ‘œμ΄λ“œ-μ›Œμ…œ μ•Œκ³ λ¦¬μ¦˜ μ‚¬μš©

  • λͺ¨λ“  λ…Έλ“œμ—μ„œ λͺ¨λ“  λ…Έλ“œκΉŒμ§€μ˜ μ΅œλ‹¨ 거리λ₯Ό κ΅¬ν•˜λŠ” λ¬Έμ œμ΄λ―€λ‘œ ν”Œλ‘œμ΄λ“œ-μ›Œμ…œ μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©
  • μ‹œκ°„ λ³΅μž‘λ„: O(N³), N=100μ΄λ―€λ‘œ μΆ©λΆ„νžˆ κ°€λŠ₯

2️⃣ μ΄ˆκΈ°ν™”

  • λ¬΄ν•œλŒ€(INF) κ°’ μ„€μ • (dist[i][j] = INF)
  • 자기 μžμ‹ μœΌλ‘œ κ°€λŠ” 경둜 dist[i][i] = 0
  • μž…λ ₯값을 λ°”νƒ•μœΌλ‘œ 직접 이동 κ°€λŠ₯ν•œ 거리 μ„€μ •

3️⃣ ν”Œλ‘œμ΄λ“œ-μ›Œμ…œ μˆ˜ν–‰

  • k번 λ…Έλ“œλ₯Ό κ±°μ³κ°€λŠ” 경둜(i → k → j)λ₯Ό κ³ λ €ν•˜μ—¬ i → j둜 κ°€λŠ” μ΅œμ†Œ λΉ„μš© κ°±μ‹ 

πŸ’» μ½”λ“œ (Java)

import java.util.*;

public class Main {
    static final int INF = 1000000000;
    static int N, M;
    static int[][] dist;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        N = sc.nextInt();
        M = sc.nextInt();
        dist = new int[N + 1][N + 1];

        // 거리 λ°°μ—΄ μ΄ˆκΈ°ν™”
        for (int i = 1; i <= N; i++) {
            Arrays.fill(dist[i], INF);
            dist[i][i] = 0; // 자기 μžμ‹ μ€ 0
        }

        // μž…λ ₯ λ°›κΈ°
        for (int i = 0; i < M; i++) {
            int a = sc.nextInt();
            int b = sc.nextInt();
            int c = sc.nextInt();
            dist[a][b] = Math.min(dist[a][b], c); // 같은 노선이 μ—¬λŸ¬ 개일 수 있음
        }

        // ν”Œλ‘œμ΄λ“œ-μ›Œμ…œ μ•Œκ³ λ¦¬μ¦˜ μˆ˜ν–‰
        for (int k = 1; k <= N; k++) {
            for (int i = 1; i <= N; i++) {
                for (int j = 1; j <= N; j++) {
                    if (dist[i][k] != INF && dist[k][j] != INF) {
                        dist[i][j] = Math.min(dist[i][j], dist[i][k] + dist[k][j]);
                    }
                }
            }
        }

        // κ²°κ³Ό 좜λ ₯
        for (int i = 1; i <= N; i++) {
            for (int j = 1; j <= N; j++) {
                System.out.print((dist[i][j] == INF ? "0" : dist[i][j]) + " ");
            }
            System.out.println();
        }
    }
}

⏱ μ‹œκ°„ λ³΅μž‘λ„ 뢄석

  • ν”Œλ‘œμ΄λ“œ-μ›Œμ…œ μ•Œκ³ λ¦¬μ¦˜: O(N³), N ≤ 100μ΄λ―€λ‘œ 100³ = 1,000,000 연산은 μΆ©λΆ„νžˆ κ°€λŠ₯

🧐 λŠλ‚€ 점

βœ… ν”Œλ‘œμ΄λ“œ-μ›Œμ…œ μ•Œκ³ λ¦¬μ¦˜μ˜ 기본적인 ν˜•νƒœλ₯Ό 읡힐 수 μžˆμ—ˆλ‹€.
βœ… 쀑볡 간선이 μ‘΄μž¬ν•  수 μžˆμœΌλ―€λ‘œ Math.min()으둜 μ΅œμ†Œ λΉ„μš© κ°±μ‹ ν•΄μ•Ό ν•œλ‹€.
βœ… κ²½λ‘œκ°€ 없을 경우 0을 좜λ ₯ν•˜λŠ” 처리λ₯Ό 쑰심해야 ν•œλ‹€.

πŸš€ κ·Έλž˜ν”„ μ΅œλ‹¨ 경둜 문제의 κΈ°λ³Έ 쀑 κΈ°λ³Έ! ν™•μ‹€ν•˜κ²Œ μ΅ν˜€μ•Ό ν•  λ¬Έμ œλ‹€. 😊

 
 
 
λ°˜μ‘ν˜•