๐Ÿณ๋ฐฑ์ค€ 11404 : ํ”Œ๋กœ์ด๋“œ

๊ธ๊ธยท2025๋…„ 9์›” 30์ผ

์•Œ๊ณ ๋ฆฌ์ฆ˜

๋ชฉ๋ก ๋ณด๊ธฐ
16/30

์ดˆ๊ธฐ ๋ฌธ์ œ ์ ‘๊ทผ

์˜ค๋žœ๋งŒ์— ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ์„ ํ’€์–ด๋ณด์•˜๋‹ค.
๊ธฐ์–ต ๋‚˜๋Š” ๊ฑด ์‚ผ์ค‘ for๋ฌธ์„ ๋Œ๋ฉด์„œ ๊ฒฝ์œ ์ง€๋ฅผ ์ง€์ •ํ•˜๊ณ , ๊ฐ€์žฅ ์ตœ์†Œ์˜ ๊ฐ’์ด ๋‚˜์˜ค๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ตฌํ•˜๋Š” ๊ฒƒ์ด์—ˆ๋‹ค.

์ด ๊ธฐ์–ต์„ ๋˜์งš์–ด ์•„๋ž˜์™€ ๊ฐ™์ด ํ’€์—ˆ๋‹ค.

1) ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋กœ ๊ฐ„์„  ์ •๋ณด๋ฅผ ์ €์žฅ
2) ์‚ผ์ค‘ for๋ฌธ์„ ๋Œ๋ฉด์„œ ์ถœ๋ฐœ์ง€, ๋„์ฐฉ์ง€, ๊ฒฝ์œ ์ง€๋ฅผ ์ง€์ •ํ•œ๋‹ค.
3) getWeight ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด ๊ฒฝ์œ ์ง€๋ฅผ ๊ฑฐ์ณ์„œ ๊ฐ€๋Š” ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•œ๋‹ค.
int path = getWieght(์ถœ๋ฐœ์ง€, ๊ฒฝ์œ ์ง€) + getWeight(๊ฒฝ์œ ์ง€, ๋„์ฐฉ์ง€)
4) for๋ฌธ์„ ๋Œ๋ฉด์„œ ์ตœ์†Œ์˜ path ๊ฐ’์„ ๊ฐฑ์‹ ํ•œ๋‹ค.

์œ„ ๋กœ์ง์œผ๋กœ๋Š” ๋‹ต์ด ์•ˆ ๋‚˜์˜จ๋‹ค.๐Ÿ˜ฟ
gemini์—๊ฒŒ ๋ฌผ์–ด๋ณด๋‹ˆ ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ์„ ์ž˜๋ชป ์ ‘๊ทผํ–ˆ๋‹ค๊ณ  ํ•œ๋‹ค.

์ด์ฐธ์— ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ์„ ๋‹ค์‹œ ์ •๋ฆฌํ•ด๋ณด์ž

๐ŸŸํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์ •๋ฆฌ

ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ์€ ๊ทธ๋ž˜ํ”„์—์„œ ๋ชจ๋“  ๋…ธ๋“œ ์Œ ๊ฐ„์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.
์Œ์ˆ˜ ๊ฐ€์ค‘์น˜๋ฅผ ๊ฐ€์ง„ ๊ฐ„์„ ์ด ์žˆ์„ ๋•Œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

๐Ÿฆ€ํ•ต์‹ฌ ์›๋ฆฌ

์ค‘๊ฐ„ ๋…ธ๋“œ(๊ฒฝ์œ ์ง€)๋ฅผ ํ—ˆ์šฉํ•˜๋ฉด์„œ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ์ ์ง„์ ์œผ๋กœ ๊ฐœ์„ 

1. ์‚ผ์ค‘ ๋ฐ˜๋ณต๋ฌธ
1) ๊ฐ€์žฅ ๋ฐ”๊นฅ์ชฝ : ๊ฒฝ์œ ์ง€ ๋…ธ๋“œ
2) ์ค‘๊ฐ„ : ์ถœ๋ฐœ ๋…ธ๋“œ
3) ์•ˆ์ชฝ : ๋„์ฐฉ์ 

2. ์ ํ™”์‹
dist[i][j]=min(dist[i][j],dist[i][k]+dist[k][j])

๐Ÿฆ€์ฝ”๋“œ ํ๋ฆ„

1) dist ๋ฐฐ์—ด ์ƒ์„ฑ ๋ฐ ์ดˆ๊ธฐํ™”

  • ๋ฌธ์ œ ์กฐ๊ฑด์— ๋”ฐ๋ผ ์ž๊ธฐ์ž์‹ ์€ 0์œผ๋กœ, ๋‚˜๋จธ์ง€๋Š” ๋ฌดํ•œ๋Œ€๋กœ
		// dist ๋ฐฐ์—ด ์ƒ์„ฑ
		dist = new int[n + 1][n + 1];

		// dist ๋ฐฐ์—ด ์ดˆ๊ธฐํ™” //์ž๊ธฐ ์ž์‹ ์€ 0์œผ๋กœ ๋‘๊ธฐ. ๋‚˜๋จธ์ง€๋Š” ๋ฌดํ•œ๋Œ€๋กœ
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= n; j++) {
				if (i == j) {
					dist[i][j] = 0;
				} else {
					dist[i][j] = INF;
				}
			}
		}

2) ์‚ผ์ค‘ for๋ฌธ์œผ๋กœ ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋Œ๋ฆฌ๊ธฐ

		// ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (3์ค‘ for๋ฌธ)
		// k๋Š” ๊ฒฝ์œ  ๋…ธ๋“œ
		for (int k = 1; k <= n; k++) {
			// i : ์ถœ๋ฐœ์ง€์ 
			for (int i = 1; i <= n; i++) {
				// j : ๋„์ฐฉ์ง€์ 
				for (int j = 1; j <= n; j++) {
					// i์—์„œ j๋กœ ๊ฐ€๋Š” ๊ธฐ์กด ๊ฒฝ๋กœ์™€ k๋ฅผ ๊ฑฐ์ณ์„œ ๊ฐ€๋Š” ๊ฒฝ๋กœ ๋น„๊ต
					// ๊ฒฝ๋กœ๊ฐ€ ์žˆ์„ ๋•Œ ์ˆ˜ํ–‰
					if (dist[i][k] != INF && dist[k][j] != INF) {
						dist[i][j] = Math.min(dist[i][j], dist[i][k] + dist[k][j]);
					}

				}
			}
		}

๐Ÿฆ€์ž˜๋ชป ์ ‘๊ทผํ•œ ๋ถ€๋ถ„

1. ํ˜„์žฌ๊นŒ์ง€ ๊ณ„์‚ฐ๋œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ๋ฐฐ์—ด(dist)์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

์ธ์ ‘ ๋ฆฌ์ŠคํŠธ static List<Edge>[] graph๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ 2์ฐจ์› ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

๋‚ด๊ฐ€ ๋งŒ๋“  getWeight() ํ•จ์ˆ˜๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐ„์„ ์ด ์žˆ์„ ๊ฒฝ์šฐ, ์ฒ˜์Œ ๋งŒ๋‚˜๋Š” ๊ฐ„์„  ํ•˜๋‚˜๋งŒ ํƒ์ƒ‰ํ•œ๋‹ค๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ๋‹ค.

2. ์‚ผ์ค‘ for๋ฌธ์˜ ์ˆœ์„œ
๊ฒฝ์œ ์ง€ > ์ถœ๋ฐœ์ง€ > ๋„์ฐฉ์ง€ ์ˆœ์œผ๋กœ ํ•ด์•ผํ•œ๋‹ค.

์ฝ”๋“œ


import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;

public class backjoon_floyd_11404_Solution {

    // ๋ฌธ์ œ์˜ ๋น„์šฉ์€ ์ตœ๋Œ€ 100,000. ๋„์‹œ ๊ฐœ์ˆ˜ n=100.
    // ์ตœ๋Œ€ ๊ฒฝ๋กœ ๋น„์šฉ์€ 100 * 100,000 = 10,000,000.
    // ๋ฌดํ•œ๋Œ€(INF) ๊ฐ’์€ ์ด๋ณด๋‹ค ์ปค์•ผ ํ•ฉ๋‹ˆ๋‹ค. int์˜ MAX_VALUE๋Š” ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.
    // 100,000,001 (1์–ต) ์ •๋„๋กœ ์„ค์ •ํ•˜๋ฉด ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.
    static final int INF = 100_000_001; 
    static int n;
    static int[][] dist; // ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ €์žฅํ•  2์ฐจ์› ๋ฐฐ์—ด

    public static void main(String[] args) throws IOException {
        // System.setIn(new FileInputStream("src/input.txt")); // ํŒŒ์ผ ์ž…๋ ฅ์€ ํ…Œ์ŠคํŠธ์šฉ์œผ๋กœ๋งŒ ์‚ฌ์šฉ

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

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

        dist = new int[n + 1][n + 1];

        // 1. dist ๋ฐฐ์—ด ์ดˆ๊ธฐํ™”: ์ž๊ธฐ ์ž์‹ ์€ 0, ๋‚˜๋จธ์ง€๋Š” INF
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                if (i == j) {
                    dist[i][j] = 0;
                } else {
                    dist[i][j] = INF;
                }
            }
        }

        // 2. ๊ฐ„์„  ์ •๋ณด๋กœ dist ๋ฐฐ์—ด ์ฑ„์šฐ๊ธฐ (์ง์ ‘ ์—ฐ๊ฒฐ๋œ ๊ฐ„์„  ์ค‘ ์ตœ์†Œ ๋น„์šฉ ์„ ํƒ)
        for (int i = 0; i < m; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int from = Integer.parseInt(st.nextToken());
            int to = Integer.parseInt(st.nextToken());
            int w = Integer.parseInt(st.nextToken());

            // ๊ฐ™์€ ๋…ธ์„ ์ด ์—ฌ๋Ÿฌ ๊ฐœ ์ฃผ์–ด์ง€๋ฉด ๋” ์ž‘์€ ๋น„์šฉ์œผ๋กœ ์ดˆ๊ธฐํ™”
            dist[from][to] = Math.min(dist[from][to], w); 
        }

        // 3. ํ”Œ๋กœ์ด๋“œ-์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‹คํ–‰ (์‚ผ์ค‘ ๋ฐ˜๋ณต๋ฌธ)
        // k: ์ค‘๊ฐ„ ์ง€์  (๊ฒฝ์œ  ๋…ธ๋“œ)
        for (int k = 1; k <= n; k++) {
            // i: ์ถœ๋ฐœ ์ง€์ 
            for (int i = 1; i <= n; i++) {
                // j: ๋„์ฐฉ ์ง€์ 
                for (int j = 1; j <= n; j++) {
                    // i์—์„œ j๋กœ ๊ฐ€๋Š” ๊ธฐ์กด ๊ฒฝ๋กœ์™€ i์—์„œ k๋ฅผ ๊ฑฐ์ณ j๋กœ ๊ฐ€๋Š” ๊ฒฝ๋กœ ๋น„๊ต
                    if (dist[i][k] != INF && dist[k][j] != INF) {
                        dist[i][j] = Math.min(dist[i][j], dist[i][k] + dist[k][j]);
                    }
                }
            }
        }

        // 4. ๊ฒฐ๊ณผ ์ถœ๋ ฅ
        StringBuilder sb = new StringBuilder();
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                // ๊ฐˆ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ (INF)๋Š” 0์œผ๋กœ ์ถœ๋ ฅ
                if (dist[i][j] == INF) {
                    sb.append(0).append(" ");
                } else {
                    sb.append(dist[i][j]).append(" ");
                }
            }
            sb.append("\n");
        }
        
        System.out.print(sb.toString());
    }
}

0๊ฐœ์˜ ๋Œ“๊ธ€