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

μ΄ν•˜μ–€Β·2024λ…„ 6μ›” 12일
0

🐣 λ°±μ€€

λͺ©λ‘ 보기
22/33

문제 μ„€λͺ…


πŸ’‘ Info

λ‚΄μš©

n(2 ≀ n ≀ 100)개의 λ„μ‹œκ°€ μžˆλ‹€. 그리고 ν•œ λ„μ‹œμ—μ„œ μΆœλ°œν•˜μ—¬ λ‹€λ₯Έ λ„μ‹œμ— λ„μ°©ν•˜λŠ” m(1 ≀ m ≀ 100,000)개의 λ²„μŠ€κ°€ μžˆλ‹€. 각 λ²„μŠ€λŠ” ν•œ 번 μ‚¬μš©ν•  λ•Œ ν•„μš”ν•œ λΉ„μš©μ΄ μžˆλ‹€.

λͺ¨λ“  λ„μ‹œμ˜ 쌍 (A, B)에 λŒ€ν•΄μ„œ λ„μ‹œ Aμ—μ„œ B둜 κ°€λŠ”λ° ν•„μš”ν•œ λΉ„μš©μ˜ μ΅œμ†Ÿκ°’μ„ κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

πŸ“₯μž…λ ₯ 쑰건

  • 첫째 쀄에 λ„μ‹œμ˜ 개수 n이 주어지고 λ‘˜μ§Έ μ€„μ—λŠ” λ²„μŠ€μ˜ 개수 m이 주어진닀. 그리고 μ…‹μ§Έ 쀄뢀터 m+2μ€„κΉŒμ§€ λ‹€μŒκ³Ό 같은 λ²„μŠ€μ˜ 정보가 주어진닀.
  • λ¨Όμ € μ²˜μŒμ—λŠ” κ·Έ λ²„μŠ€μ˜ 좜발 λ„μ‹œμ˜ λ²ˆν˜Έκ°€ 주어진닀.
  • λ²„μŠ€μ˜ μ •λ³΄λŠ” λ²„μŠ€μ˜ μ‹œμž‘ λ„μ‹œ a, 도착 λ„μ‹œ b, ν•œ 번 νƒ€λŠ”λ° ν•„μš”ν•œ λΉ„μš© c둜 이루어져 μžˆλ‹€.
  • μ‹œμž‘ λ„μ‹œμ™€ 도착 λ„μ‹œκ°€ 같은 κ²½μš°λŠ” μ—†λ‹€. λΉ„μš©μ€ 100,000보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜μ΄λ‹€.
  • μ‹œμž‘ λ„μ‹œμ™€ 도착 λ„μ‹œλ₯Ό μ—°κ²°ν•˜λŠ” 노선은 ν•˜λ‚˜κ°€ 아닐 수 μžˆλ‹€.
    5
    14
    1 2 2
    1 3 3
    1 4 1
    1 5 10
    2 4 2
    3 4 1
    3 5 1
    4 5 3
    3 5 10
    3 1 8
    1 4 2
    5 1 7
    3 4 2
    5 2 4

πŸ“€μΆœλ ₯ 쑰건

  • n개의 쀄을 좜λ ₯ν•΄μ•Ό ν•œλ‹€.
  • i번째 쀄에 좜λ ₯ν•˜λŠ” j번째 μˆ«μžλŠ” λ„μ‹œ iμ—μ„œ j둜 κ°€λŠ”λ° ν•„μš”ν•œ μ΅œμ†Œ λΉ„μš©μ΄λ‹€.
  • λ§Œμ•½, iμ—μ„œ j둜 갈 수 μ—†λŠ” κ²½μš°μ—λŠ” κ·Έ μžλ¦¬μ— 0을 좜λ ₯ν•œλ‹€.
    0 2 3 1 4
    12 0 15 2 5
    8 5 0 1 1
    10 7 13 0 3
    7 4 10 6 0


문제 이해


  • ν”Œλ‘œμ΄λ“œ μ›Œμ…œ μ•Œκ³ λ¦¬μ¦˜μ„ μ΄μš©ν•΄ λΉ„μš©μ˜ μ΅œμ†Ÿκ°’ κ΅¬ν•˜κΈ°


μ•Œκ³ λ¦¬μ¦˜


μ‹€μ œ 풀이 μ‹œκ°„ : 17λΆ„

  • μž…λ ₯
    • N, M μž…λ ₯λ°›κΈ°
  • 계산
    • 2차원 ν…Œμ΄λΈ” TD μ΄ˆκΈ°ν™”
    • κ°„μ„  정보 λ°›μ•„μ„œ μ΄ˆκΈ°ν™”
    • ν”Œλ‘œμ΄λ“œ μ›Œμ…œ μ•Œκ³ λ¦¬μ¦˜ κ΅¬ν˜„
  • 좜λ ₯
    • κ²°κ³Ό result 좜λ ₯ν•˜κΈ°
import java.util.*;

public class Main {

    static final int INF = (int) 1e9;
    static int n;
    static int m;

    public static int[][] TD;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        n = sc.nextInt();
        m = sc.nextInt();

        TD = new int[n][n];

        for (int i = 0; i < 101; i++) {
            Arrays.fill(TD[i], INF);
        }

        for (int a = 1; a <= n; a++) {
            for (int b = 1; b <= n; b++) {
                if (a == b) TD[a][b] = 0;
            }
        }

        for (int k = 1; k <= n; k++) {
            for (int a = 1; a <= n; a++) {
                for (int b = 1; b <= n; b++) {
                    TD[a][b] = Math.min(TD[a][b], TD[a][k] + TD[k][b]);
                }
            }
        }

        for (int a = 1; a <= n; a++) {
            for (int b = 1; b <= n; b++) {
                if (TD[a][b] == INF) {
                    System.out.print(0 + " ");
                }
                else {
                    int result = TD[a][b];
                    System.out.print(result + " ");
                }
            }
            System.out.println();
        }
    }
}


μ˜€λ‹΅μ²΄ν¬


  • Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 5

    • μ •ν™•ν•œ 수둜 ν‘œν˜„ν•΄μ€˜μ•Ό 함!
    • κ°„μ„  μ΄ˆκΈ°ν™”λ„ μΆ”κ°€ν•΄μ€˜μ•Ό 함!
    //before
    TD = new int[n][n];
    ...
    for (int a = 1; a <= n; a++) {
        for (int b = 1; b <= n; b++) {
            if (a == b) TD[a][b] = 0;
        }
    }
    
    for (int k = 1; k <= n; k++) {
        for (int a = 1; a <= n; a++) {
            for (int b = 1; b <= n; b++) {
                TD[a][b] = Math.min(TD[a][b], TD[a][k] + TD[k][b]);
            }
        }
    }
    
    //after
    TD = new int[101][101];
    ...
    
    for (int a = 1; a <= n; a++) {
        for (int b = 1; b <= n; b++) {
            if (a == b) TD[a][b] = 0;
        }
    }
    
    for (int i = 0; i < m; i++) {
        int a = sc.nextInt();
        int b = sc.nextInt();
        int c = sc.nextInt();
        if (c < TD[a][b]) TD[a][b] = c;
    }


μ΅œμ’… 풀이


μ‹€μ œ 풀이 μ‹œκ°„ : 40λΆ„(첫 풀이 μ‹œκ°„ 포함)

  • μž…λ ₯
    • N, M μž…λ ₯λ°›κΈ°
  • 계산
    • 2차원 ν…Œμ΄λΈ” TD μ΄ˆκΈ°ν™”
    • κ°„μ„  정보 λ°›μ•„μ„œ μ΄ˆκΈ°ν™”
    • ν”Œλ‘œμ΄λ“œ μ›Œμ…œ μ•Œκ³ λ¦¬μ¦˜ κ΅¬ν˜„
  • 좜λ ₯
    • κ²°κ³Ό result 좜λ ₯ν•˜κΈ°
import java.util.*;

public class Main {

    static final int INF = (int) 1e9;
    static int n;
    static int m;

    public static int[][] TD;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        n = sc.nextInt();
        m = sc.nextInt();

        TD = new int[101][101];

        for (int i = 0; i < 101; i++) {
            Arrays.fill(TD[i], INF);
        }

        for (int a = 1; a <= n; a++) {
            for (int b = 1; b <= n; b++) {
                if (a == b) TD[a][b] = 0;
            }
        }

        for (int i = 0; i < m; i++) {
            int a = sc.nextInt();
            int b = sc.nextInt();
            int c = sc.nextInt();
            if (c < TD[a][b]) TD[a][b] = c;
        }

        for (int k = 1; k <= n; k++) {
            for (int a = 1; a <= n; a++) {
                for (int b = 1; b <= n; b++) {
                    TD[a][b] = Math.min(TD[a][b], TD[a][k] + TD[k][b]);
                }
            }
        }

        for (int a = 1; a <= n; a++) {
            for (int b = 1; b <= n; b++) {
                if (TD[a][b] == INF) {
                    System.out.print(0 + " ");
                }
                else {
                    int result = TD[a][b];
                    System.out.print(result + " ");
                }
            }
            System.out.println();
        }
    }
}

profile
μ–Έμ  κ°€ λ‚΄ μ½”λ“œλ‘œ 세상에 κΈ°μ—¬ν•  수 μžˆλ„λ‘, BE 개발 기둝 λ…ΈνŠΈβ˜˜οΈ

0개의 λŒ“κΈ€