์•Œ๊ณ ๋ฆฌ์ฆ˜/DP

[๋ฐฑ์ค€ 1943 ๐Ÿฅ‡] ๋™์ „ ๋ถ„๋ฐฐ

1eehyunji 2023. 8. 16. 00:01

๋ฌธ์ œ

์œคํ™”์™€ ์ค€ํฌ๋Š” ์†”์„ ์ˆ˜๋ฒ”ํ•˜์—ฌ ์“ฐ๋ ˆ๊ธฐ๋ฅผ ์ค๋Š” ์ฐฉํ•œ ์ผ์„ ํ•˜์˜€๋‹ค. ์›์žฅ์„ ์ƒ๋‹˜๊ป˜์„œ๋Š” ์œคํ™”์™€ ์ค€ํฌ๋ฅผ ์นญ์ฐฌํ•˜์‹œ๊ณ  ๊ณผ์ž๋‚˜ ์‚ฌ ๋จน์œผ๋ผ๊ณ  ํ•˜์‹œ๋ฉฐ ๋™์ „ ๋ช‡ ๊ฐœ๋ฅผ ์œคํ™”์™€ ์ค€ํฌ์—๊ฒŒ ๊ฑด๋„ค ์ฃผ์—ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ๋ˆ์„ ๋ฐ›์€ ์œคํ™”์™€ ์ค€ํฌ๋Š” ์ข‹์•„ํ•˜๊ธฐ๋ณด๋‹ค ๊ณ ๋ฏผ์— ๋น ์ง€๊ณ  ๋ง์•˜๋‹ค. ์›์žฅ์„ ์ƒ๋‹˜๊ป˜ ๋ฐ›์€ ์ด ๋ˆ์„ ์–ด๋–ป๊ฒŒ ๋‚˜๋ˆ„์–ด ํ• ์ง€ ๊ณ ๋ฏผ์— ๋น ์ง„ ๊ฒƒ์ด๋‹ค. ๋‘ ์‚ฌ๋žŒ ๋ชจ๋‘ ์ƒ๋Œ€๋ฐฉ์ด ์ž๊ธฐ๋ณด๋‹ค 1์›์ด๋ผ๋„ ๋” ๋ฐ›๋Š” ๊ฒƒ์€ ๋„์ €ํžˆ ์ธ์ •ํ•  ์ˆ˜ ์—†์–ด ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋ˆ์„ ๋˜‘๊ฐ™์ด ๋‘˜๋กœ ๋‚˜๋ˆ„์–ด ๊ฐ€์ ธ์•ผ ๋‘ ์‚ฌ๋žŒ์ด ๋ชจ๋‘ ๋งŒ์กฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

ํ•˜์ง€๋งŒ ๋‘ ์‚ฌ๋žŒ์—๊ฒŒ ๋ˆ์„ ๋˜‘๊ฐ™์ด ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 500์›์งœ๋ฆฌ 1๊ฐœ์™€ 50์›์งœ๋ฆฌ 1๊ฐœ๋ฅผ ๋ฐ›์•˜๋‹ค๋ฉด, ์ด ๋ˆ์„ ๋‘ ์‚ฌ๋žŒ์ด ๋˜‘๊ฐ™์ด ๋‚˜๋ˆ„์–ด ๊ฐ€์งˆ ์ˆ˜๋Š” ์—†๋‹ค. ๋ฌผ๋ก  ๋™์ „์„ ๋ฐ˜์œผ๋กœ ์ž˜๋ผ์„œ ๋‚˜๋ˆ„์–ด ๊ฐ€์งˆ ์ˆ˜๋„ ์žˆ๊ฒ ์ง€๋งŒ ๊ทธ๋Ÿฌ๋ฉด ๋ˆ์œผ๋กœ์„œ์˜ ๊ฐ€์น˜๋ฅผ ์žƒ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜๋Š” ์—†๋‹ค.

์ด์ œ ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ์›์žฅ ์„ ์ƒ๋‹˜๊ป˜์„œ N๊ฐ€์ง€ ์ข…๋ฅ˜์˜ ๋™์ „์„ ๊ฐ๊ฐ ๋ช‡ ๊ฐœ์”ฉ ์ฃผ์…จ์„ ๋•Œ, ๊ทธ ๋ˆ์„ ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋Š”์ง€ ์—†๋Š”์ง€ ํŒ๋‹จํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ž…๋ ฅ

์„ธ ๊ฐœ์˜ ์ž…๋ ฅ์ด ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ์ž…๋ ฅ์˜ ์ฒซ์งธ ์ค„์— ๋™์ „์˜ ์ข…๋ฅ˜ N(1 ≤ N ≤ 100)์ด ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ์ž…๋ ฅ์˜ ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N+1์งธ ์ค„๊นŒ์ง€ ๊ฐ๊ฐ์˜ ๋™์ „์˜ ๊ธˆ์•ก๊ณผ ๊ฐœ์ˆ˜๊ฐ€ ๋นˆ ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฃผ์–ด์ง„๋‹ค. ๋‹จ, ์›์žฅ์„ ์ƒ๋‹˜๊ป˜์„œ ์ฃผ์‹  ๊ธˆ์•ก์˜ ์ด ํ•ฉ์€ 100,000์›์„ ๋„˜์ง€ ์•Š๋Š”๋‹ค. ๋™์ „์˜ ๊ธˆ์•ก๊ณผ ๊ฐœ์ˆ˜๋Š” ์ž์—ฐ์ˆ˜์ด๊ณ , ๊ฐ™์€ ๊ธˆ์•ก์„ ๊ฐ€์ง„ ๋™์ „์ด ๋‘ ๋ฒˆ ์ด์ƒ ์ฃผ์–ด์ง€๋Š” ๊ฒฝ์šฐ๋Š” ์—†๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„๋ถ€ํ„ฐ ์„ธ ์ค„์— ๊ฑธ์ณ, ๊ฐ ์ž…๋ ฅ์— ๋Œ€ํ•˜์—ฌ ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋ฉด 1, ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉด 0์„ ์ถœ๋ ฅํ•œ๋‹ค.

๋ฌธ์ œํ’€์ด

import sys

for _ in range(3):
    n=int(sys.stdin.readline())
    coins=[]
    amount=0
    for _ in range(n):
        coin, num=map(int, sys.stdin.readline().strip().split(' '))
        coins.append([coin, num])
        amount+=coin*num
    # ์ด์•ก์ด ํ™€์ˆ˜์ด๋ฉด ๋˜‘๊ฐ™์ด ๋ถ„๋ฐฐํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ 0 ์ถœ๋ ฅํ•˜๊ณ  ์ข…๋ฃŒ
    if amount%2==1:
        print(0)
        continue
    goal=amount//2
    dp=[1]+[0]*(goal)
    for coin, num in coins:
        for n in range(goal,coin-1, -1):
            if dp[n-coin]==1:
                for i in range(num):
                    if n+coin*i<=goal:
                        dp[n+coin*i]=1
                    else:
                        break
    if dp[-1]==1:
        print(1)
    else:
        print(0)
  • ๋ƒ…์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ์ œ์˜€๋‹ค.
    • ์ดํ•ด๋๋‹ค ์‹ถ๋‹ค๊ฐ€๋„ ๋‹ค์‹œ ๋ณด๋ฉด ๋˜ ์ž˜ ์ดํ•ด๊ฐ€ ์•ˆ๋œ๋‹ค.. ์™„๋ฒฝํ•˜๊ฒŒ ์ดํ•ดํ•œ ๊ฒŒ ์•„๋‹Œ ๊ฑฐ ๊ฐ™๋‹ค. ๋ƒ…์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ œ๋Œ€๋กœ ํŒŒ๊ณ  ๋“ค์–ด์„œ ๋ƒ…์ƒ‰๋งŒ ๋”ฐ๋กœ ํฌ์ŠคํŒ…ํ•ด์•ผ๊ฒ ๋‹ค!
  • ๋™์ „๊ณผ ๋™์ „ ๊ฐœ์ˆ˜๋ฅผ ์ž…๋ ฅ๋ฐ›์œผ๋ฉด์„œ ์ด์•ก์„ ๊ณ„์‚ฐํ•ด์ฃผ๋Š”๋ฐ ์ด๋•Œ ์ด์•ก์ด ํ™€์ˆ˜๋ผ๋ฉด ๋‘˜๋กœ ๋˜‘๊ฐ™์ด ๋‚˜๋ˆ ์ง€์ง„ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— 0์„ ์ถœ๋ ฅํ•˜๊ณ  ๋„˜์–ด๊ฐ€๋ฉด ๋œ๋‹ค.
  • ์ด์•ก์ด ์ง์ˆ˜๋ผ๋ฉด DP๋ฅผ ์ด์šฉํ•ด์„œ DP[์ด์•ก//2] ๊ฐ’์ด 1์ธ์ง€, ์ฆ‰ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋™์ „๋“ค๋กœ ์ด์•ก//2 ๊ฐ’์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
  • ์—ฌ๊ธฐ์„œ dp[n]์˜ ์˜๋ฏธ๋Š” ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋™์ „๋“ค๋กœ n์›์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋Š”์ง€(1), ์—†๋Š”์ง€(0)๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
  • ๋จผ์ € DP ๋ฐฐ์—ด์„ ์„ ์–ธํ•  ๋•Œ DP[0]์€ 1๋กœ ์ดˆ๊ธฐํ™”ํ•ด์ค€๋‹ค. (์•„๋ฌด๊ฒƒ๋„ ์•ˆ ๋‚ด๋„ ์ง€๋ถˆ ๊ฐ€๋Šฅํ•˜๋‹ˆ๊นŒ) ๊ทธ๋ฆฌ๊ณ  ๋‚˜๋จธ์ง€ ๊ฐ’๋“ค์€ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ด์ค€๋‹ค.
  • ์ž…๋ ฅ๋ฐ›์€ ๋™์ „(coin)๊ณผ ๊ฐ ๋™์ „์˜ ๊ฐœ์ˆ˜(num)๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋ฉด์„œ DP ๊ฐ’์„ ์ฑ„์›Œ์ค€๋‹ค.
  • ๋ณ€์ˆ˜ goal์— ์ €์žฅ๋œ ์ด์•ก//2 ๊ฐ’๋ถ€ํ„ฐ, ํ˜„์žฌ ํƒ์ƒ‰ ์ค‘์ธ coin๊นŒ์ง€ for๋ฌธ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋ฉด์„œ dp[n-coin]์ด ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฐ’์ธ์ง€(1) ํ™•์ธํ•œ๋‹ค.
  • ์ฆ‰, 'n-coin'์ด ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฐ’์ด๋ผ๋ฉด(dp[n-coin]) ์šฐ๋ฆฌ๋Š” ํ˜„์žฌ coin์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— n ๋˜ํ•œ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ˆ˜๊ฐ€ ๋œ๋‹ค.
    • ์ด์ œ coin์˜ ๊ฐœ์ˆ˜(num)-1๋งŒํผ for๋ฌธ์„ ๋Œ๋ฉด์„œ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฐ’์„ dp์— ๊ฐฑ์‹ ํ•ด์ค€๋‹ค.
    • coin 1๊ฐœ๋ฅผ ์ด์šฉํ•˜๋ฉด n์€ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ˆ˜๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์— coin์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋‚จ๋Š” ํ•œ n+coin*1, n+coin*2,..,n+coin*(num-1)๋„ goal์„ ์ดˆ๊ณผํ•˜์ง€ ์•Š์œผ๋ฉด ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ˆ˜๊ฐ€ ๋œ๋‹ค.
  • ์ด ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•ด์„œ ๋ชจ๋“  ๋™์ „์„ ํƒ์ƒ‰ํ•˜๊ณ  ๋‚˜์„œ, dp์˜ ๋งˆ์ง€๋ง‰ ๊ฐ’ ์ฆ‰, dp[์ด์•ก//2] ๊ฐ’์ด 1์ด๋ผ๋ฉด ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ 1์„ ์ถœ๋ ฅํ•˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด 0์„ ์ถœ๋ ฅํ•œ๋‹ค.