[Python/ํŒŒ์ด์ฌ][๐Ÿฅ‡5] ๋ฐฑ์ค€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ 12865 - ํ‰๋ฒ”ํ•œ๋ฐฐ๋‚ญ

keyneneยท2022๋…„ 12์›” 19์ผ
1

Python

๋ชฉ๋ก ๋ณด๊ธฐ
24/26

๐Ÿ“–[Python/ํŒŒ์ด์ฌ][๐Ÿฅ‡5] ๋ฐฑ์ค€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ 12865 - ํ‰๋ฒ”ํ•œ๋ฐฐ๋‚ญ

๐Ÿ“œ๋ฌธ์ œ



๐Ÿ’ก์•Œ๊ณ ๋ฆฌ์ฆ˜

Dynamic Programming - DP (๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ)

ํ•˜๋‚˜์˜ ๋ฌธ์ œ๋ฅผ ๋‹จ ํ•œ ๋ฒˆ๋งŒ ํ’€๋„๋ก ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜
#sub-solution #list #memoization

DP๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์กฐ๊ฑด

  1. ํฐ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ(sub-solution)๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์„ ๋•Œ
  2. ์ž‘์€ ๋ฌธ์ œ์—์„œ ๊ตฌํ•œ ์†”๋ฃจ์…˜์œผ๋กœ ํฐ ๋ฌธ์ œ์˜ ์†”๋ฃจ์…˜์„ ๊ตฌํ•  ์ˆ˜ ์žˆ์„ ๋•Œ
  3. ์ž‘์€ ๋ฌธ์ œ๋“ค์ด ๊ฒน์น  ๋•Œ
๐Ÿ‘‰๐Ÿป ํฌ๊ณ  ์–ด๋ ค์šด ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋ฉด ๊ทธ๊ฒƒ์„ ๋จผ์ € ์ž˜๊ฒŒ ๋‚˜๋ˆ„์–ด์„œ ํ•ด๊ฒฐํ•œ ๋’ค์— ์ฒ˜๋ฆฌํ•˜์—ฌ ๋‚˜์ค‘์— ์ „์ฒด์˜ ๋‹ต์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ. 
๋ฉ”๋ชจ์•„์ด์ œ์ด์…˜(Memoization)์ด ์‚ฌ์šฉ๋จ(๋ถ„ํ• ์ •๋ณต๊ณผ ๋‹ค๋ฅธ ์ด์œ ). 
์ด๋ฏธ ๊ณ„์‚ฐํ•œ ๊ฒฐ๊ณผ๋Š” ๋ฐฐ์—ด์— ์ €์žฅํ•จ์œผ๋กœ์จ ๋‚˜์ค‘์— ๋™์ผํ•œ ๊ณ„์‚ฐํ•  ๋•Œ ๋‹จ์ˆœํžˆ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋˜๋Š” ์›๋ฆฌ.

๐Ÿ“•ํ’€์ด๋ฐฉํ–ฅ

limit๊ฐ’๊ณผ ๋ฌด์—‡์„ ๊ตฌํ•˜๊ณ ์žํ•˜๋Š” ๋ฌธ์ œ์ธ์ง€ ํŒŒ์•…ํ•˜๋Š” ๊ฒƒ์ด ๊ด€๊ฑด์ธ DP๋ฌธ์ œ์ด๋‹ค.
"์ตœ๋Œ€ K๋งŒํผ์˜ ๋ฌด๊ฒŒ๋งŒ์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฐ๋‚ญ"์—์„œ "๋ฌผ๊ฑด๋“ค์˜ ๊ฐ€์น˜์˜ ์ตœ๋Œ“๊ฐ’"์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋ฏ€๋กœ ๊ฐ€์น˜(V)๊ฐ’์— ์ดˆ์ ์„ ๋‘๊ณ  ํ•ด๊ฒฐํ•˜์ž.


๐Ÿ“์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„์ˆœ์„œ

์•„๋ž˜ ํ‘œ๋ฅผ ์ดํ•ดํ•˜๋ฉด DP๋กœ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฐ ์…€์€ ๊ฐ ํ–‰ ์ด์ „์˜ ๋ฌด๊ฒŒ(W)์™€ ๊ฐ€์น˜(V)๋งŒ ์•Œ๊ณ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์„ ๋•Œ์˜ ์ตœ๋Œ€ ๊ฐ€์น˜์˜ ํ•ฉ์ด๋‹ค.
bag=[[W1,V1],[W2,V2], ...]๋กœ ๊ฐ€์ •ํ•ด๋ณด์ž.

  1. bag=[[6,13]]์ธ ๋ฌผ๊ฑด๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ
    K=0~5์ด๋ฉด ์•„๋ฌด๊ฒƒ๋„ ๋ฐฐ๋‚ญ์— ๋‹ด์„ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ V=0,
    K=6์ด์ƒ์ธ ๊ฒฝ์šฐ W=6์ธ ๋ฌผ๊ฑด ๋‹จ ํ•˜๋‚˜๋งŒ ๋‹ด์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ V=13์ด๋‹ค.

  2. bag=[[6,13], [4,8]]์ธ ๊ฒฝ์šฐ
    K=0~3์ด๋ฉด V=0,
    K=4~5์ด๋ฉด V=8์ด ๋œ๋‹ค.
    ๊ทธ๋Ÿฌ๋‚˜ K=6์ด์ƒ์ธ ๊ฒฝ์šฐ๋Š” [4,8]๋ณด๋‹ค [6,13]์ด V๊ฐ€ ๋” ๋†’๊ธฐ ๋•Œ๋ฌธ์— V=13์ด๋‹ค.

  3. bag=[[6,13], [4,8], [3,6]]์ธ ๊ฒฝ์šฐ
    K=0~2์ด๋ฉด V=0,
    K=3์ด๋ฉด V=6,
    K=4~5์ด๋ฉด V=8,
    K=6์ด๋ฉด V=13์ด ๋œ๋‹ค.
    ๊ทธ๋Ÿฌ๋‚˜ K=7์ผ ๋•Œ๋Š” W=3์ธ ๋ฌผ๊ฑด๊ณผ W=4์ธ ๋ฌผ๊ฑด์„ ๋‘˜ ๋‹ค ๋‹ด์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ V=14์ด๋‹ค.

๐Ÿ“Œ๋‹ค์‹œ ํ‘œ๋ฅผ ์‚ดํŽด๋ณด์ž.

[4,8]ํ–‰์—์„œ K=7์ผ ๋•Œ [4,8]์„ ๋‹ด๋Š” ๊ฒƒ๋ณด๋‹ค [6,13]์„ ๋‹ด๋Š” ๊ฒƒ์ด ๊ฐ€์น˜๊ฐ€ ์ปค์„œ V=13์ด๋ผ๊ณ  ํ–ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ [3,6]ํ–‰์—์„œ๋Š” K=7์ผ ๋•Œ, [6,13]์„ ๋‹ด๋Š” ๊ฒƒ๋ณด๋‹ค [4,8]๊ณผ [3,6] ๋‘๊ฐœ๋ฅผ ๋‹ด๋Š” ๊ฒƒ์ด ๊ฐ€์น˜๊ฐ€ ์ปค์„œ V=14์ด๋‹ค.

์—ฌ๊ธฐ์„œ ์ฃผ์˜ํ•  ์ ์€,
[4,8]ํ–‰์˜ K=7์ผ ๋•Œ ๊ฐ’์ด "13"์ธ๋ฐ (๋…ธ๋ž€์Œ์˜),
[4,8]ํ–‰์—์„œ K=7์ธ ๊ฐ’(13)๋ณด๋‹ค K=7-3์ผ ๋•Œ์˜ V(8) + [3,6]๋ฌผ๊ฑด์˜ V(6)์ธ ๊ฐ’์ด ๋” ํฌ๊ธฐ๋•Œ๋ฌธ์— V=14๋ผ๋Š” ๊ฒƒ์ด๋‹ค. (๋นจ๊ฐ„์Œ์˜์˜ ํ•ฉ)
์ด ๊ธฐ์ค€์ด ๋งŒ์กฑํ•˜์ง€ ์•Š์œผ๋ฉด DP[i][j] = DP[i-1][j]์ธ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค!

DP[i][j] = max(DP[i-1][j], DP[i-1][bag[i-1][0]]+bag[i][1])
#ํ‘œ์˜ ์œ— ์…€๊ณผ ํ˜„์žฌ๋ฌผ๊ฑด์˜V+์ด์ „๋ฌผ๊ฑด์˜V๊ฐ’์˜ ์ตœ๋Œ“๊ฐ’์ด ๋ฐ”๋กœ DP๊ฐ’์ž„

์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด์„œ ๋‹ค์‹œ ์‚ดํŽด๋ณด์ž.


๐Ÿ’ป๊ฒฐ๊ณผ์ฝ”๋“œ


import sys
input = sys.stdin.readline

N, K = map(int, input().split())
bag = [list(map(int, input().split())) for _ in range(N)]
dp = [[0]*(K+1) for _ in range(N+1)]
#DPํ‘œ๋Š” 0~K+1, 0~N+1๋กœ ๊ตฌ์„ฑํ•˜์ž (N=1์ผ ๋•Œ, DP[i-1][j]๊ฐ€ ์กด์žฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ)

for i in range(1,N+1):
    for j in range(1,K+1):
        if j >= bag[i-1][0]:  #"ํ˜„์žฌ์ตœ๋Œ€๋ฌด๊ฒŒj๊ฐ€ ํ•ด๋‹น๋ฌผ๊ฑด๋ฌด๊ฒŒ๋ณด๋‹ค ํฐ ๊ฒฝ์šฐ
        #ํ‘œ์˜ ์œ— ์…€์˜ ๊ฐ’๊ณผ ํ˜„์žฌ๋ฌผ๊ฑด์˜V+์ด์ „๋ฌผ๊ฑด์˜V๊ฐ’์˜ ์ตœ๋Œ“๊ฐ’์„ DP[i][j]์— ์ €์žฅ
            dp[i][j] = max(bag[i-1][1]+dp[i-1][j-bag[i-1][0]],dp[i-1][j])
        else:
        	#"ํ˜„์žฌ์ตœ๋Œ€๋ฌด๊ฒŒj๊ฐ€ ํ•ด๋‹น๋ฌผ๊ฑด๋ฌด๊ฒŒ๋ณด๋‹ค ์ž‘์€ ๊ฒฝ์šฐ (ํ˜„์žฌ ๋ฌผ๊ฑด์„ ๋‹ด์„ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ)
            dp[i][j] = dp[i-1][j]

print(dp[N][K])  #DP[N][K]๊ฐ€ ๋ฌด์กฐ๊ฑด ์ •๋‹ต

๐Ÿ“š์ •๋ฆฌ

์œ„์—์„œ ๋™์ž‘์›๋ฆฌ ์„ค๋ช…์€ ๋‹ค ํ–ˆ์œผ๋ฏ€๋กœ ๋ช‡ ๊ฐ€์ง€ ์ฒดํฌ์‚ฌํ•ญ์— ๋Œ€ํ•ด์„œ๋งŒ ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

  1. DP๊ฐ€ N+1ํ–‰, K+1์—ด์ธ ์ด์œ ?
    N=1์ธ ๊ฒฝ์šฐ, DP[i-1][j]๊ฐ’์ด ์กด์žฌํ•ด์•ผ ํ•œ๋‹ค.
    ์ฆ‰, ์•„๋ฌด๊ฒƒ๋„ ๋‹ด์ง€ ์•Š์€ ๋นˆ ๋ฐฐ๋‚ญ์˜ ์ƒํƒœ๋ฅผ ์ดˆ๊ธฐํ™” ํ•ด๋†“๊ธฐ ์œ„ํ•ด 0ํ–‰, 0์—ด์ด ํ•„์š”ํ•˜๋‹ค.

  2. j >= bag[i-1][0] ์—์„œ bag์˜ i๊ฐ’์„ i-1์œผ๋กœ ๋น„๊ตํ•˜๋Š” ์ด์œ ?
    ์šฐ์„  bag๋ฆฌ์ŠคํŠธ๋Š” [[6,13], [4,8], [3,6]...]์ด๋ ‡๊ฒŒ ์ €์žฅ๋˜๋ฏ€๋กœ 0ํ–‰์ด ์ฒซ ๋ฒˆ์งธ ๊ฐ’์ด๋‹ค.
    ์ฆ‰ DP์—์„œ 0๋ฒˆ์งธ ๋ฌผ๊ฑด์ด 0, 1๋ฒˆ์งธ๊ฐ€ [6,13]์ธ๋ฐ, bag์—์„œ๋Š” 0๋ฒˆ์งธ ๋ฌผ๊ฑด์ด๋ฏ€๋กœ 1์”ฉ ์ฐจ์ด๊ฐ€ ๋‚œ๋‹ค.

  3. j >= bag[i-1][0] ์—์„œ๋งŒ max๊ฐ’์œผ๋กœ ๋น„๊ตํ•˜๋Š” ์ด์œ ?
    ํ˜„์žฌ์ตœ๋Œ€๋ฌด๊ฒŒ j๊ฐ€ ํ˜„์žฌ๋ฌผ๊ฑด์˜๋ฌด๊ฒŒ(bag[i-1][0])๋ณด๋‹ค ์ž‘๋‹ค๋ฉด ํ˜„์žฌ๋ฌผ๊ฑด์„ ๋‹ด์„ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
    ์ด ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ฉด DP[i][j] = DP[i-1][j]์„ ๋”ฐ๋ฅธ๋‹ค.
    ๐Ÿ‘‰๐Ÿป ํ•ด๋‹น ์…€์˜ ์œ— ์…€์ด ํ˜„์žฌ์ตœ๋Œ€๋ฌด๊ฒŒj์—์„œ ์ตœ๋Œ“๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ
    ๐Ÿ‘‰๐Ÿป ์œ— ์…€์„ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ถ”๊ฐ€ ๊ณ„์‚ฐ์ด ํ•„์š”์—†๋‹ค (DP)
    ex) [4,8]์ธ๋ฐ j๊ฐ€ 3์ธ ๊ฒฝ์šฐ
        ์ตœ๋Œ€๋ฌด๊ฒŒ๊ฐ€ 3์ด๋ฉด, ๋ฌด๊ฒŒ๊ฐ€ 4์ธ ๋ฌผ๊ฑด์€ ๋‹ด์„ ์ˆ˜ ์—†๋‹ค!
profile
keynene

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