๋ฐ˜์‘ํ˜•
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 15:46
๊ด€๋ฆฌ ๋ฉ”๋‰ด

ImJay

[BOJ/Java] 11066. ํŒŒ์ผ ํ•ฉ์น˜๊ธฐ ๋ณธ๋ฌธ

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

[BOJ/Java] 11066. ํŒŒ์ผ ํ•ฉ์น˜๊ธฐ

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

๐Ÿ“Œ [BOJ/Java] 11066. ํŒŒ์ผ ํ•ฉ์น˜๊ธฐ

๐Ÿ”— ๋ฌธ์ œ ๋งํฌ: ๋ฐฑ์ค€ 11066๋ฒˆ - ํŒŒ์ผ ํ•ฉ์น˜๊ธฐ


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

๐Ÿ“‚ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŒŒ์ผ์ด ์—ฐ์†์œผ๋กœ ๋†“์—ฌ ์žˆ๊ณ , ์ด๋ฅผ ํ•˜๋‚˜์˜ ํŒŒ์ผ๋กœ ํ•ฉ์น˜๋Š” ์ตœ์†Œ ๋น„์šฉ์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.
๐Ÿ’ฐ ํŒŒ์ผ์„ ํ•ฉ์น˜๋Š” ๋น„์šฉ์€ ๋‘ ํŒŒ์ผ ํฌ๊ธฐ์˜ ํ•ฉ์ด๋ฉฐ, ์—ฌ๋Ÿฌ ๋ฒˆ ํ•ฉ์น  ๊ฒฝ์šฐ ๋ˆ„์  ๋น„์šฉ์ด ์ฆ๊ฐ€ํ•œ๋‹ค.
๐Ÿ› ๏ธ ํŒŒ์ผ์„ ํ•ฉ์น˜๋Š” ์ˆœ์„œ๋ฅผ ์ž˜ ์ •ํ•ด์•ผ ์ตœ์†Œ ๋น„์šฉ์ด ๋œ๋‹ค.

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

  • ํŒŒ์ผ์„ ์–ด๋–ค ์ˆœ์„œ๋กœ ํ•ฉ์น˜๋Š”์ง€๊ฐ€ ์ค‘์š”ํ•˜๋ฉฐ, ์ตœ์ ์˜ ์ˆœ์„œ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ๋™์  ๊ณ„ํš๋ฒ•(DP)์„ ํ™œ์šฉํ•œ๋‹ค.

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

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

  • K๊ฐœ์˜ ํŒŒ์ผ ํฌ๊ธฐ๋ฅผ ์ž…๋ ฅ๋ฐ›๊ณ , **๋ˆ„์  ํ•ฉ ๋ฐฐ์—ด(sum[])**์„ ๋งŒ๋“ ๋‹ค.
  • dp[i][j]๋Š” i๋ฒˆ์งธ ํŒŒ์ผ๋ถ€ํ„ฐ j๋ฒˆ์งธ ํŒŒ์ผ๊นŒ์ง€ ํ•ฉ์น˜๋Š” ์ตœ์†Œ ๋น„์šฉ์„ ์˜๋ฏธํ•œ๋‹ค.

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

  • ๋ถ€๋ถ„ ํŒŒ์ผ๋“ค์„ ํ•ฉ์น˜๋Š” ์ตœ์†Œ ๋น„์šฉ์„ ๊ตฌํ•˜๋Š” ์ ํ™”์‹์„ ์‚ฌ์šฉํ•œ๋‹ค.
  • dp[i][j] = min(dp[i][k] + dp[k+1][j] + sum[j] - sum[i-1])
    (i๋ถ€ํ„ฐ j๊นŒ์ง€ ํ•ฉ์น˜๋Š” ์ตœ์†Œ ๋น„์šฉ์„ ์ฐพ๊ธฐ ์œ„ํ•ด, ์ค‘๊ฐ„ k๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋‚˜๋ˆ„์–ด ๊ณ„์‚ฐ)

3๏ธโƒฃ ์ตœ์ ์˜ ํŒŒ์ผ ํ•ฉ์น˜๊ธฐ ์ˆœ์„œ๋ฅผ ์ฐพ๊ธฐ

  • ์ž‘์€ ๊ตฌ๊ฐ„๋ถ€ํ„ฐ ์ ์ฐจ ํฐ ๊ตฌ๊ฐ„๊นŒ์ง€ ์ตœ์ ์˜ ํ•ด๋ฅผ ์ฐพ์•„๊ฐ„๋‹ค.
  • DP ํ…Œ์ด๋ธ”์„ ์ฑ„์šด ํ›„ dp[1][K] ๊ฐ’์ด ์ตœ์†Œ ๋น„์šฉ์ด ๋œ๋‹ค.

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

import java.util.*;

public class Main {
    static int[][] dp;
    static int[] sum;
    static int K;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int T = sc.nextInt(); // ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ๊ฐœ์ˆ˜

        while (T-- > 0) {
            K = sc.nextInt();
            int[] files = new int[K + 1];
            dp = new int[K + 1][K + 1];
            sum = new int[K + 1];

            for (int i = 1; i <= K; i++) {
                files[i] = sc.nextInt();
                sum[i] = sum[i - 1] + files[i]; // ๋ˆ„์ ํ•ฉ ๋ฐฐ์—ด
            }

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

    public static int mergeFiles() {
        for (int len = 2; len <= K; len++) { // ๋ถ€๋ถ„ ํŒŒ์ผ ๊ธธ์ด (2๊ฐœ ์ด์ƒ)
            for (int i = 1; i + len - 1 <= K; 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] + (sum[j] - sum[i - 1]);
                    dp[i][j] = Math.min(dp[i][j], cost);
                }
            }
        }

        return dp[1][K]; // ์ „์ฒด ํŒŒ์ผ์„ ํ•ฉ์น˜๋Š” ์ตœ์†Œ ๋น„์šฉ
    }
}

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

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


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

โœ… ์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•œ ๋™์  ๊ณ„ํš๋ฒ•(DP) ๋ฌธ์ œ๋กœ,
๋ถ€๋ถ„ ๋ฌธ์ œ๋ฅผ ์ •์˜ํ•˜๊ณ  ์ ํ™”์‹์„ ์„ธ์šฐ๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ด์—ˆ๋‹ค.

โœ… ๋ˆ„์  ํ•ฉ ๋ฐฐ์—ด(sum[])์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งค๋ฒˆ ๋ถ€๋ถ„ ํ•ฉ์„ ๊ตฌํ•˜์ง€ ์•Š๋„๋ก ์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

โœ… ํŒŒ์ผ์„ ํ•ฉ์น˜๋Š” ์ˆœ์„œ๋ฅผ ์ง์ ‘ ์ •ํ•˜๋Š” ๊ฒŒ ์•„๋‹Œ, DP๋กœ ์ตœ์ ์˜ ํ•ด๋ฅผ ์ฐพ๋Š” ๋ฐฉ์‹์ด ํฅ๋ฏธ๋กœ์› ๋‹ค! ๐Ÿš€

๋ฐ˜์‘ํ˜•
Comments