• Home
  • About
    • on Weekend photo

      on Weekend

      ๐™Ž๐™ฉ๐™ช๐™™๐™ฎ๐™ž๐™ฃ๐™œ

    • Learn More
    • Instagram
    • Github
  • Archive
    • All Posts
    • All Tags
    • All Categories
  • Categories
    • Problem Solving
    • TIL
    • Study
    • Etc
    • ํ•„์‚ฌ
  • Projects

[๋ฐฑ์ค€] 2293

17 Mar 2021

๋ฌธ์ œ

2293 : ๋™์ „ 1 ๋ฌธ์ œ์ด๋‹ค.

n๊ฐ€์ง€ ์ข…๋ฅ˜์˜ ๋™์ „์„ ์ ๋‹นํžˆ ์‚ฌ์šฉํ•ด์„œ k์›์„ ๋งŒ๋“œ๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‚ฌ์šฉํ•œ ๋™์ „์˜ ๊ตฌ์„ฑ์ด ๊ฐ™์€๋ฐ, ์ˆœ์„œ๊ฐ€ ๋‹ค๋ฅธ ๊ฒƒ์€ ๊ฐ™์€ ๊ฒฝ์šฐ์ด๋‹ค.

์•Œ๊ณ ๋ฆฌ์ฆ˜

๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฌธ์ œ์ด๋‹ค. ์™œ๋ƒํ•˜๋ฉด

  • ์ „์ฒด ๋ฌธ์ œ๋ฅผ ๋ถ€๋ถ„ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ๋ถ€๋ถ„ ๋ฌธ์ œ์˜ ๋‹ต์„ ์ด์šฉํ•ด ์ „์ฒด ๋ฌธ์ œ์˜ ๋‹ต์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

DP์˜ ๊ธฐ๋ฒ•

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

DP๋Š” ๊ฒฝํ—˜ํ•ด๋ณธ ๋ฐ” ๋‘ ๊ฐ€์ง€ ๋ถ„๋ฅ˜๋กœ ๋‚˜๋‰˜๋Š”๋ฐ,

  1. ์ ํ™”์‹์ด ์‰ฝ์ง€๋งŒ DP์— ์–ด๋–ค ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ์ €์žฅํ•  ์ง€ ์•Œ์•„๋‚ด๋Š” ๊ฒŒ ์–ด๋ ค์šด ๊ฒฝ์šฐ
  2. ์ ํ™”์‹์ด ์–ด๋ ค์šด ๊ฒฝ์šฐ

๋กœ ๋‚˜๋‰˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

ํ•ด๋‹น ๋ฌธ์ œ์˜ ๊ฒฝ์šฐ์—๋Š” 1์— ํ•ด๋‹นํ•œ๋‹ค. DP์— ์–ด๋–ค ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ์ €์žฅํ• ์ง€๋ฅผ ์ •ํ•˜๋ฉด, ๋ฐ”๋กœ ๋‹ต์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์ ‘๊ทผ

๋‚ด ๊ฒฝ์šฐ ์ฒ˜์Œ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋กœ ์ž˜๋ชป ์ž‘์„ฑํ–ˆ์—ˆ๋‹ค. DP ๋ฐฐ์—ด์˜ ์ •์˜๋ฅผ __K์›์„ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜__๋กœ ์„ค์ •ํ–ˆ์œผ๋ฉฐ, ์ด์ „ ์ฝ”์ธ ์กฐํ•ฉ ์ค‘์— N๋ฒˆ์งธ ์ข…๋ฅ˜์˜ ์ฝ”์ธ์„ ๋”ํ–ˆ์„ ๋•Œ K์›์ด ๋‚˜์˜ค๋Š” ๊ฒฝ์šฐ๋ฅผ DP์— ๋‹ด์•„์ฃผ์—ˆ๋‹ค.

์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

dp[0] = 1 # Base Condition
for goalCoinSum in range(1,k+1) :
	for coin in coins :
        if(goalCoinSum >= coin) :
            dp[goalCoinSum] += dp[goalCoinSum-coin]

์ด๋ ‡๊ฒŒ ํ•  ๊ฒฝ์šฐ ์˜ˆ์ œ์˜ ๋‹ต์— ๋น„ํ•ด, ๊ต‰์žฅํžˆ ๋งŽ์€ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์–ป๊ฒŒ ๋œ๋‹ค. ์™œ ๊ทธ๋Ÿฐ์ง€ ๊ณฐ๊ณฐํžˆ ์ƒ๊ฐํ•ด๋ณด๋‹ˆ ๋‚ด ์ ‘๊ทผ๋ฒ•์€ ์ˆœ์„œ ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.

k์›์„ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ฐ ์ฝ”์ธ ์ข…๋ฅ˜๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ ์‚ดํ”ผ๊ณ  ์žˆ๋‹ค. ์ด๊ฑธ ์˜ˆ์ œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์กฐํ•ฉ์œผ๋กœ ํ’€์–ด์„œ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค.

dp[1] : dp[1-1] = (1)

dp[2] : dp[2-1] + dp[2-2] = (1,1) + (2)

dp[3] : dp[3-1] + dp[3-2] = (1,2) (1,1,1) + (2,1)

dp[4] : dp[4-1] + dp[4-2] = (1,2,1)(1,1,1,1)(2,1,1) + (1,1,2)(2,2)

dp[5] : dp[5-1] + dp[5-2] + dp[5-5] = (1,2,1,1)(1,1,1,1,1)(2,1,1,1)(1,1,2,1)(2,2,1) + (1,2,2)(1,1,1,2)(2,1,2) + (5)

โ€ฆ

์œ„์ฒ˜๋Ÿผ ๊ฒฐ๊ตญ ์กฐํ•ฉ ์ค‘๋ณต์ด ์žˆ๋Š”, ์ฆ‰ ์ˆœ์„œ๊ฐ€ ์žˆ๋Š” ์กฐํ•ฉ์„ ๋งŒ๋“ค์–ด๋‚ด๊ณ  ์žˆ์—ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๊ตฌํ•ด์•ผํ•˜๋Š” DP๋ฐฐ์—ด์€ ์˜ˆ์ œ๋กœ ํ’€์–ด์„œ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

dp[1] : (1)

dp[2] : (2) (1,1)

dp[3] : (2,1) (1,1,1)

dp[4] : (2,1,1) (1,1,1,1) (2,2)

dp[5] : (2,1,1,1) (1,1,1,1,1) (2,2,1) (5)

๊ทธ๋ ‡๋‹ค๋ฉด ์ด๊ฑธ ์–ด๋–ป๊ฒŒ ๊ตฌํ•ด์•ผํ• ๊นŒ? ๋‹ต์€ ์ˆœ์„œ๋ฅผ ๊ฐ•์ œํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. [1,2,5] ๋ฐฐ์—ด์ด๋ผ๋ฉด 1๋ณด๋‹ค 2๋Š” ๋’ค์—, 2๋ณด๋‹ค 5๋Š” ๋’ค์— ๋ถ™๊ฒŒ๋” ๊ณ ๋ คํ•ด์ค€๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” coin ๋ฐฐ์—ด์„ ๋จผ์ € ์ˆœํšŒํ•˜๊ณ , ์•ˆ์ชฝ ๋ฃจํ”„์—์„œ k์›์„ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ตฌํ•ด์ค€๋‹ค.

์ฆ‰, 1์›์ด 1~k์›์ด ๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋ชจ๋‘ ๊ตฌํ•ด์ฃผ๊ณ , ๊ทธ ๋‹ค์Œ์— 2์›์ด 1~k์›์ด ๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋ชจ๋‘ ๊ตฌํ•ด์ฃผ๊ณ , ๊ทธ ๋‹ค์Œ์—๋Š” 5์›์ด 1~k์›์ด ๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋ชจ๋‘ ๊ตฌํ•ด์ค€๋‹ค.

๊ฒฐ๊ตญ ์ •๋‹ต ์ „์ฒด์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์ •๋‹ต์ฝ”๋“œ

n, k = map(int, input().split())
coins = [int(input()) for _ in range(n)]
dp = [0]*(k+1)
dp[0] = 1
for coin in coins :
    for goalCoinSum in range(1,k+1) :
        if(goalCoinSum >= coin) :
            dp[goalCoinSum] += dp[goalCoinSum-coin]
print(dp[k])


problem_solvingpython Share Tweet +1