BAEKJOON-9084-๋™์ „

A Yeon Jangยท2025๋…„ 8์›” 4์ผ

๐Ÿช™ ๋ฐฑ์ค€ 9084๋ฒˆ:๋™์ „(DP)


๐Ÿง ๋ฌธ์ œ ํ•ด์„

  • ๊ฐ ํ…Œ์ŠคํŠธ์˜ ๊ฐœ์ˆ˜ ๋งˆ๋‹ค ์ง€๋ถˆํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์˜ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
  • ๊ธˆ์•ก์˜ ์ข…๋ฅ˜๊ฐ€ ์ฃผ์–ด์ง€๋ฉฐ ๊ฐ ๋™์ „์€ ๋ฌดํ•œํ•˜๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.

๐ŸŽฏ ๋ชฉํ‘œ:

N๊ฐ€์ง€์˜ ๋™์ „ ์ข…๋ฅ˜๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ M์ด๋ผ๋Š” ๊ธˆ์•ก์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.


๐Ÿ” ํ•ต์‹ฌ ์•„์ด๋””์–ด

์ด ๋ฌธ์ œ๋Š” knapsack ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ ์šฉ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” DP ๋ฌธ์ œ์ด๋‹ค.

โœ… DP ํ…Œ์ด๋ธ” ์šฉ๋„

  • dp[i][j] : i๊ฐœ ์ข…๋ฅ˜์˜ ๋™์ „์„ ์‚ฌ์šฉํ–ˆ์„๋•Œ j๋ผ๋Š” ๊ธˆ์•ก์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๋ฐฉ๋ฒ•์˜ ์ˆ˜

๐Ÿ“Œ ํ•ต์‹ฌ ํฌ์ธํŠธ

๐Ÿ”ถ ์ฒซ๋ฒˆ์งธ ๋™์ „๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

๋ฐ˜๋ณต๋ฌธ์œผ๋กœ dpํ…Œ์ด๋ธ”์„ ์กฐ์‚ฌํ•˜๊ธฐ ์ „ ์ดˆ๊ธฐ๊ฐ’ ์„ค์ •์„ ์œ„ํ•ด ์ฒซ๋ฒˆ์งธ ๋™์ „์— ๋Œ€ํ•œ dpํ…Œ์ด๋ธ” ๊ฐ’์„ ์กฐ์‚ฌํ•œ๋‹ค.

for j in range(0, total + 1):
    if j % coins[0] == 0:
        dp[0][j] = 1

์ฒซ๋ฒˆ์žฌ ๋™์ „์œผ๋กœ j๋ผ๋Š” ๊ธˆ์•ก์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋ฉด 1์ด๋‹ค.

๐Ÿ”ถ i๋ฒˆ์งธ ๋™์ „์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

for i in range(1, n):
    for j in range(total + 1):
        dp[i][j] = dp[i - 1][j]
        if j >= coins[i]:
            dp[i][j] += dp[i][j - coins[i]]
  • dp[i][j]๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ˜„์žฌ ๋‚ด ์†์— ์žˆ๋Š” i๋ฒˆ์งธ ๋™์ „๊นŒ์ง€๋งŒ ์‚ฌ์šฉํ–ˆ์„๋•Œ์˜ ๊ฐ’์„ ๊ธฐ๋ณธ ๊ฐ’์œผ๋กœ ๊ฐ€์ ธ์™€์•ผ ํ•œ๋‹ค.
    • ์ฆ‰, ๋‚ด ์†์— ์žˆ๋Š” ๋™์ „์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋ฅผ ๋จผ์ € ๊ธฐ๋กํ•œ๋‹ค.
  • ๋งŒ์•ฝ ๋‚ด ์†์— ์žˆ๋Š” ๋™์ „์„ ์‚ฌ์šฉํ•ด์„œ๋„ ํ•ด๋‹น ๊ธˆ์•ก์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ทธ ๊ธˆ์•ก์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋”ํ•ด์ค€๋‹ค
    • j-coins[i] : i๋ฒˆ์งธ ๋™์ „์œผ๋กœ j๋ผ๋Š” ๊ธˆ์•ก์„ ์ฑ„์šธ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋”ฑ i๊นŒ์ง€๋งŒ ์ฑ„์›Œ์ง„ dp ์ตœ์ ํ•ด์— ํ˜„์žฌ ์ตœ์ ํ•ด๋ฅผ ๋”ํ•ด์ค€๋‹ค.

์ฆ‰,

  • dp[i][j] = dp[i - 1][j]: i๋ฒˆ์งธ ๋™์ „์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ (์ด์ „ ๋™์ „์œผ๋กœ๋งŒ ๊ตฌ์„ฑ)
  • dp[i][j] += dp[i][j - coin[i]]: i๋ฒˆ์งธ ๋™์ „์„ ํ•œ ๋ฒˆ ์ด์ƒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

๐Ÿ’ฏ ์ •๋‹ต


t = int(input())

for _ in range(t):
    n = int(input())
    coins = list(map(int, input().split()))
    total = int(input())

    dp = [[0] * (total + 1) for _ in range(n)]

    
for j in range(0, total + 1):
    if j % coins[0] == 0:
        dp[0][j] = 1
print(dp)

for i in range(1, n):
    for j in range(total + 1):
        dp[i][j] = dp[i - 1][j]
        if j >= coins[i]:
            dp[i][j] += dp[i][j - coins[i]]

print(dp[n - 1][total])


๐Ÿ’ญ ์ƒ๊ฐ

โœ… ๊ฒฐ๋ก  ํ•œ ์ค„

์ •๋ง knapsack ๊ทธ ์ž์ฒด์˜ ๋ฌธ์ œ๋‹ค


๐Ÿ˜ฎโ€๐Ÿ’จ DP...

์•„์ง ๋ฌธ์ œ๋ฅผ ๋งŽ์ด ํ’€์–ด๋ณด์ง€๋Š” ๋ชปํ–ˆ์ง€๋งŒ ์ •๋ง ์–ด๋ ต๋‹ค.
์ ํ™”์‹ ์„ธ์šฐ๋Š” ๊ฒƒ๋„, ๋ญ˜ ๊ด€๊ณ„์ธ์ž๋กœ ๋ด์•ผ๋ ์ง€๋„ ์ •๋ง ๋ชจ๋ฅด๊ฒ ๋‹ค.
knapsack ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ •๋ฆฌํ•˜๊ณ  ์ž์‹ ๋งŒ๋•…์ด์—ˆ๋Š”๋ฐ ๊ณ ์ž‘ ๋ฌผ๊ฑด์ด ๋™์ „์œผ๋กœ ๋ฐ”๋€Œ๊ณ  ๊ฐ€๋ฐฉ์ด ๊ธˆ์•ก์œผ๋กœ ๋ฐ”๋€ ๋ฌธ์ œ์—์„œ๋ถ€ํ„ฐ ํ—ค๋งค๋‹ค๋‹ˆ ํ‘ํ‘์ด๋‹ค ์ •๋ง ~

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