๋ฐ˜์‘ํ˜•
Notice
Recent Posts
Recent Comments
Link
ยซ   2025/03   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
Archives
Today
Total
03-10 19:43
๊ด€๋ฆฌ ๋ฉ”๋‰ด

ImJay

[BOJ/Java] 11049. ํ–‰๋ ฌ ๊ณฑ์…ˆ ์ˆœ์„œ ๋ณธ๋ฌธ

์•Œ๊ณ ๋ฆฌ์ฆ˜/BOJ - Java

[BOJ/Java] 11049. ํ–‰๋ ฌ ๊ณฑ์…ˆ ์ˆœ์„œ

ImJay 2025. 3. 10. 09:36
๋ฐ˜์‘ํ˜•

๐Ÿ“Œ [BOJ/Java] 11049. ํ–‰๋ ฌ ๊ณฑ์…ˆ ์ˆœ์„œ

๐Ÿ”— ๋ฌธ์ œ ๋งํฌ: ๋ฐฑ์ค€ 11049๋ฒˆ - ํ–‰๋ ฌ ๊ณฑ์…ˆ ์ˆœ์„œ


๐Ÿ“– ๋ฌธ์ œ ํ•ด์„

๐Ÿ“Œ N๊ฐœ์˜ ํ–‰๋ ฌ์ด ์ฃผ์–ด์งˆ ๋•Œ, ๋ชจ๋“  ํ–‰๋ ฌ์„ ๊ณฑํ•˜๋Š” ์ตœ์†Œ ์—ฐ์‚ฐ ํšŸ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.
๐Ÿ’ฐ ํ–‰๋ ฌ ๊ณฑ์…ˆ ์—ฐ์‚ฐ ํšŸ์ˆ˜๋Š” A(p×q) × B(q×r) = p × q × r๋กœ ๊ณ„์‚ฐ๋œ๋‹ค.
๐Ÿ› ๏ธ ํ–‰๋ ฌ์„ ๊ณฑํ•˜๋Š” ์ˆœ์„œ์— ๋”ฐ๋ผ ์—ฐ์‚ฐ ํšŸ์ˆ˜๊ฐ€ ๋‹ฌ๋ผ์ง€๋ฏ€๋กœ ์ตœ์ ์˜ ๊ณฑ์…ˆ ์ˆœ์„œ๋ฅผ ์ฐพ์•„์•ผ ํ•œ๋‹ค.

๐ŸŽฏ ํ•ต์‹ฌ ๊ฐœ๋…

  • dp[i][j] = i๋ฒˆ์งธ ํ–‰๋ ฌ๋ถ€ํ„ฐ j๋ฒˆ์งธ ํ–‰๋ ฌ๊นŒ์ง€ ๊ณฑํ•˜๋Š” ์ตœ์†Œ ์—ฐ์‚ฐ ํšŸ์ˆ˜
  • dp[i][j] = min(dp[i][k] + dp[k+1][j] + cost(A[i] ~ A[k], A[k+1] ~ A[j]))
    (i๋ถ€ํ„ฐ j๊นŒ์ง€ ๊ณฑํ•˜๋Š” ์ตœ์ ์˜ k๋ฅผ ์ฐพ๋Š”๋‹ค.)

๐Ÿ› ๏ธ ํ’€์ด ๊ณผ์ •

1๏ธโƒฃ ์ž…๋ ฅ ์ฒ˜๋ฆฌ ๋ฐ ์ดˆ๊ธฐํ™”

  • ํ–‰๋ ฌ ๊ฐœ์ˆ˜ N์„ ์ž…๋ ฅ๋ฐ›๊ณ , ๊ฐ ํ–‰๋ ฌ์˜ (ํ–‰, ์—ด) ํฌ๊ธฐ๋ฅผ ์ €์žฅํ•œ๋‹ค.
  • dp[i][j] ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๊ณ , ๋Œ€๊ฐ์„ (dp[i][i])์„ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.

2๏ธโƒฃ DP ํ…Œ์ด๋ธ” ์ฑ„์šฐ๊ธฐ

  • ๋ถ€๋ถ„ ํ–‰๋ ฌ ํฌ๊ธฐ(2๊ฐœ ์ด์ƒ)๋ถ€ํ„ฐ ์ ์ง„์ ์œผ๋กœ ์ฆ๊ฐ€์‹œํ‚ค๋ฉฐ dp[i][j] ๊ฐ’์„ ๊ฐฑ์‹ ํ•œ๋‹ค.
  • dp[i][j] = min(dp[i][k] + dp[k+1][j] + cost) ๋ฅผ ํ†ตํ•ด ์ตœ์ ์˜ k๋ฅผ ์ฐพ๋Š”๋‹ค.

3๏ธโƒฃ ์ตœ์†Œ ์—ฐ์‚ฐ ํšŸ์ˆ˜ ์ฐพ๊ธฐ

  • dp[1][N]์ด ์ „์ฒด ํ–‰๋ ฌ์„ ๊ณฑํ•˜๋Š” ์ตœ์†Œ ์—ฐ์‚ฐ ํšŸ์ˆ˜๊ฐ€ ๋œ๋‹ค.

๐Ÿ’ป ์ฝ”๋“œ ๊ตฌํ˜„ (Java)

import java.util.*;

public class Main {
    static int[][] dp;
    static int[][] matrix;
    static int N;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        N = sc.nextInt();
        matrix = new int[N + 1][2]; // ํ–‰๋ ฌ ํฌ๊ธฐ ์ €์žฅ
        dp = new int[N + 1][N + 1];

        for (int i = 1; i <= N; i++) {
            matrix[i][0] = sc.nextInt(); // ํ–‰ ํฌ๊ธฐ
            matrix[i][1] = sc.nextInt(); // ์—ด ํฌ๊ธฐ
        }

        System.out.println(matrixChainOrder());
    }

    public static int matrixChainOrder() {
        for (int len = 2; len <= N; len++) { // ๋ถ€๋ถ„ ํ–‰๋ ฌ ๊ธธ์ด (2๊ฐœ ์ด์ƒ)
            for (int i = 1; i + len - 1 <= N; i++) { // ์‹œ์ž‘ ์ธ๋ฑ์Šค
                int j = i + len - 1; // ๋ ์ธ๋ฑ์Šค
                dp[i][j] = Integer.MAX_VALUE;

                for (int k = i; k < j; k++) { // ์ค‘๊ฐ„ ์ง€์  k
                    int cost = dp[i][k] + dp[k + 1][j] + (matrix[i][0] * matrix[k][1] * matrix[j][1]);
                    dp[i][j] = Math.min(dp[i][j], cost);
                }
            }
        }

        return dp[1][N]; // ์ „์ฒด ํ–‰๋ ฌ์„ ๊ณฑํ•˜๋Š” ์ตœ์†Œ ์—ฐ์‚ฐ ํšŸ์ˆ˜
    }
}

โฑ๏ธ ์‹œ๊ฐ„ ๋ณต์žก๋„ ๋ถ„์„

๐Ÿ“Œ O(N³) (์ตœ๋Œ€ 500³ = ์•ฝ 1์–ต 2500๋งŒ ์—ฐ์‚ฐ)
๐Ÿ’ก dp[i][j]๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด ์ค‘๊ฐ„ ์ง€์  k๋ฅผ ํƒ์ƒ‰ํ•ด์•ผ ํ•˜๋ฏ€๋กœ **O(N²) × O(N) = O(N³)**์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค.
๐Ÿ”ฅ ๋‹คํ–‰ํžˆ N ≤ 500์ด๋ฏ€๋กœ DP๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ถฉ๋ถ„ํžˆ ํ•ด๊ฒฐ ๊ฐ€๋Šฅํ•˜๋‹ค.


๐Ÿ’ก ๋Š๋‚€์ 

โœ… ์ตœ์ ์˜ ํ–‰๋ ฌ ๊ณฑ์…ˆ ์ˆœ์„œ๋ฅผ ์ฐพ๋Š” DP ๋ฌธ์ œ๋กœ,
๋‹จ์ˆœํžˆ ์ฐจ๋ก€๋กœ ๊ณฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๋ถ€๋ถ„ ๋ฌธ์ œ๋ฅผ ์ •์˜ํ•˜๊ณ  ์ตœ์ ์˜ ์ˆœ์„œ๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ–ˆ๋‹ค.

โœ… ํ–‰๋ ฌ ๊ณฑ์…ˆ ์—ฐ์‚ฐ ํšŸ์ˆ˜๋ฅผ ๊ตฌํ•  ๋•Œ, ํ–‰๋ ฌ ํฌ๊ธฐ๋ฅผ ๊ณ ๋ คํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ด์—ˆ๋‹ค.

โœ… ํŒŒ์ผ ํ•ฉ์น˜๊ธฐ(11066) ๋ฌธ์ œ์™€ ์œ ์‚ฌํ•œ ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค! ๐Ÿš€

๋ฐ˜์‘ํ˜•
Comments