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

ImJay

[BOJ/Java] 7579. ์•ฑ ๋ณธ๋ฌธ

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

[BOJ/Java] 7579. ์•ฑ

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

๐Ÿ“Œ [BOJ/Java] 7579. ์•ฑ

๐Ÿ”— ๋ฌธ์ œ ๋งํฌ: ๋ฐฑ์ค€ 7579๋ฒˆ - ์•ฑ


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

๐Ÿ“ฑ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์•ฑ์ด ์‹คํ–‰ ์ค‘์ด๋ฉฐ, ์ด๋ฅผ ์ข…๋ฃŒํ•˜๊ฑฐ๋‚˜ ์ผ๋ถ€ ๋น„ํ™œ์„ฑํ™”ํ•˜์—ฌ M ๋ฐ”์ดํŠธ ์ด์ƒ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ™•๋ณดํ•˜๋Š” ์ตœ์†Œ ๋น„์šฉ์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.
๐Ÿ’ฐ ์•ฑ์„ ๋น„ํ™œ์„ฑํ™”ํ•  ๋•Œ **๋น„ํ™œ์„ฑํ™” ๋น„์šฉ(์ถ”๊ฐ€ ๋ฐฐํ„ฐ๋ฆฌ ์†Œ๋น„ ๋“ฑ)**์ด ์กด์žฌํ•˜๋ฉฐ,
๐Ÿ› ๏ธ ์ตœ์†Œํ•œ์˜ ๋น„์šฉ์œผ๋กœ M ๋ฐ”์ดํŠธ ์ด์ƒ ํ™•๋ณดํ•ด์•ผ ํ•œ๋‹ค.

โœ… ํ•ต์‹ฌ ๊ฐœ๋…

  • **๋ถ€๋ถ„ ๋ฐฐ๋‚ญ ๋ฌธ์ œ(0/1 Knapsack)**๊ณผ ์œ ์‚ฌ
  • ์ตœ์ ์˜ ์•ฑ ๋น„ํ™œ์„ฑํ™” ์กฐํ•ฉ์„ ์ฐพ๋Š” DP ํ™œ์šฉ
  • ๋น„์šฉ(cost)์„ ๊ธฐ์ค€์œผ๋กœ ์ตœ์†Œ ๋น„์šฉ์œผ๋กœ M ๋ฐ”์ดํŠธ ํ™•๋ณดํ•˜๋„๋ก ์ตœ์ ํ™”

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

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

  • N๊ฐœ์˜ ์•ฑ์˜ **๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰(memory[])**๊ณผ **๋น„ํ™œ์„ฑํ™” ๋น„์šฉ(cost[])**์„ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค.
  • dp[c]๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„ํ™œ์„ฑํ™” ๋น„์šฉ์ด c์ผ ๋•Œ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ €์žฅํ•œ๋‹ค.
  • **์ตœ๋Œ€ ๋น„์šฉ(C)**์„ ๊ณ„์‚ฐํ•˜์—ฌ dp ๋ฐฐ์—ด์„ ํฌ๊ธฐ C + 1๋กœ ์ƒ์„ฑ

2๏ธโƒฃ 0/1 Knapsack ๋ฐฉ์‹์œผ๋กœ DP ๊ฐฑ์‹ 

  • ์•ฑ์„ ํ•˜๋‚˜์”ฉ ๊ณ ๋ คํ•˜๋ฉฐ, ๋’ค์—์„œ๋ถ€ํ„ฐ ๋น„์šฉ์„ ํ™•์ธํ•˜๋ฉด์„œ DP ๊ฐฑ์‹ 
  • dp[j] = max(dp[j], dp[j - cost[i]] + memory[i])
  • ๋น„์šฉ j๋ฅผ ํ˜„์žฌ ์•ฑ์˜ cost[i]๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์€ ๊ฐ’๋ถ€ํ„ฐ ์ฒ˜๋ฆฌํ•ด์•ผ ์ค‘๋ณต ์‚ฌ์šฉ ๋ฐฉ์ง€ ๊ฐ€๋Šฅ

3๏ธโƒฃ M ๋ฐ”์ดํŠธ ์ด์ƒ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ ๋น„์šฉ ์ฐพ๊ธฐ

  • dp[j] >= M์„ ๋งŒ์กฑํ•˜๋Š” ์ตœ์†Œ j๋ฅผ ์ถœ๋ ฅ

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

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        int N = sc.nextInt(); // ์•ฑ ๊ฐœ์ˆ˜
        int M = sc.nextInt(); // ํ™•๋ณดํ•ด์•ผ ํ•  ๋ฉ”๋ชจ๋ฆฌ
        int[] memory = new int[N]; // ์•ฑ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰
        int[] cost = new int[N]; // ์•ฑ ๋น„ํ™œ์„ฑํ™” ๋น„์šฉ
        int sumCost = 0;

        for (int i = 0; i < N; i++) {
            memory[i] = sc.nextInt();
        }
        for (int i = 0; i < N; i++) {
            cost[i] = sc.nextInt();
            sumCost += cost[i]; // ์ตœ๋Œ€ ๋น„์šฉ ๊ณ„์‚ฐ
        }

        int[] dp = new int[sumCost + 1]; // ๋น„์šฉ ๋ณ„ ์ตœ๋Œ€ ํ™•๋ณด ๊ฐ€๋Šฅ ๋ฉ”๋ชจ๋ฆฌ ์ €์žฅ
        Arrays.fill(dp, 0);

        for (int i = 0; i < N; i++) { // ๊ฐ ์•ฑ์— ๋Œ€ํ•ด DP ๊ฐฑ์‹ 
            for (int j = sumCost; j >= cost[i]; j--) { // ๋’ค์—์„œ๋ถ€ํ„ฐ ์—…๋ฐ์ดํŠธ
                dp[j] = Math.max(dp[j], dp[j - cost[i]] + memory[i]);
            }
        }

        // M ์ด์ƒ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ ๋น„์šฉ ์ฐพ๊ธฐ
        for (int j = 0; j <= sumCost; j++) {
            if (dp[j] >= M) {
                System.out.println(j);
                break;
            }
        }
    }
}

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

๐Ÿ“Œ O(N × C) (์ตœ๋Œ€ 100 × 10000 = 100๋งŒ ์—ฐ์‚ฐ)
๐Ÿ’ก dp[j]๋ฅผ ๊ฐฑ์‹ ํ•˜๋Š” ๊ณผ์ •์ด O(N × C)์ด๋ฏ€๋กœ ์ถฉ๋ถ„ํžˆ ํ•ด๊ฒฐ ๊ฐ€๋Šฅ


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

โœ… ๋ฐฐ๋‚ญ ๋ฌธ์ œ(0/1 Knapsack)์™€ ์œ ์‚ฌํ•œ ๋ฌธ์ œ์˜€์œผ๋ฉฐ,

  • ๋ฐฐ์—ด์„ ๋น„์šฉ(cost) ๊ธฐ์ค€์œผ๋กœ ๊ฐฑ์‹ ํ•˜๋Š” ๋ฐฉ์‹์„ ์ตํž ์ˆ˜ ์žˆ์—ˆ๋‹ค.
  • ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•˜์ง€ ์•Š๊ณ , ๋น„์šฉ์„ ๊ธฐ์ค€์œผ๋กœ DP๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์ ์ด ์ฐจ์ด์ 

โœ… ์•ฑ์„ ํ•˜๋‚˜์”ฉ ๊ณ ๋ คํ•˜๋ฉด์„œ ๋’ค์—์„œ๋ถ€ํ„ฐ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐฉ์‹์ด ํ•ต์‹ฌ์ด์—ˆ๋‹ค.
โœ… ๋น„์šฉ์ด ์ตœ์†Œํ•œ์œผ๋กœ ์œ ์ง€๋˜๋„๋ก DP ๋ฐฐ์—ด์„ ์ตœ์ ํ™”ํ•˜๋Š” ์ „๋žต์„ ๋‹ค์‹œ ๋ณต์Šตํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๐Ÿš€

๋ฐ˜์‘ํ˜•
Comments