๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
4๏ธโƒฃ Python/Problem Solving

[Python Algorithm] ํ‰๋ฒ”ํ•œ ๋ฐฐ๋‚ญ BOJ #12865

by seolhee2750 2021. 11. 25.
๋ฌธ์ œ

https://www.acmicpc.net/problem/12865

 

12865๋ฒˆ: ํ‰๋ฒ”ํ•œ ๋ฐฐ๋‚ญ

์ฒซ ์ค„์— ๋ฌผํ’ˆ์˜ ์ˆ˜ N(1 ≤ N ≤ 100)๊ณผ ์ค€์„œ๊ฐ€ ๋ฒ„ํ‹ธ ์ˆ˜ ์žˆ๋Š” ๋ฌด๊ฒŒ K(1 ≤ K ≤ 100,000)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‘ ๋ฒˆ์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— ๊ฑฐ์ณ ๊ฐ ๋ฌผ๊ฑด์˜ ๋ฌด๊ฒŒ W(1 ≤ W ≤ 100,000)์™€ ํ•ด๋‹น ๋ฌผ๊ฑด์˜ ๊ฐ€์น˜ V(0 ≤ V ≤ 1,000)

www.acmicpc.net

 

๋‚ด ๋ฌธ์ œ ํ’€์ด
n, k = map(int, input().split())
memory = [[0]*(k+1) for _ in range(n+1)] # [n+1][k+1] ํฌ๊ธฐ์˜ 0์œผ๋กœ ์ฑ„์›Œ์ง„ ๋ฐฐ์—ด

for i in range(1, n+1):
    w, v = map(int, input().split()) # ํ˜„์žฌ ์ž…๋ ฅ๋œ ๋ฌผ๊ฑด์˜ ๋ฌด๊ฒŒ, ๊ฐ€์น˜
    for j in range(1, k+1):
        if w <= j: memory[i][j] = max(memory[i-1][j], memory[i-1][j-w]+v)
        else: memory[i][j] = memory[i-1][j]

print(memory[n][k])

๐Ÿ‘‰ dp - ๋ƒ…์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ๋กœ, ๋ฌด๊ฒŒ๋ณ„, ๋ฌผ๊ฑด๋ณ„ ๋ฐฐ๋‚ญ์ด ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๊ฐ€์น˜๋ฅผ ๋ˆ„์ ํ•˜๋Š”๊ฒŒ ํฌ์ธํŠธ!

  • 1. 0์œผ๋กœ ์ฑ„์›Œ์ง„ nํ–‰ k์—ด์˜ memory ๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•ด์ฃผ์—ˆ๋‹ค.
    1-1) ๋ฌธ์ œ์—์„œ ์ฃผ์–ด์ง„ ์ž…๋ ฅ๊ณผ ๊ฐ™์ด n์€ ๋ฌผ๊ฑด์˜ ๊ฐœ์ˆ˜, k๋Š” ์ตœ๋Œ€ ๋ฌด๊ฒŒ๋ฅผ ์˜๋ฏธํ•˜๋Š” ๋งŒํผ
    memory์˜ ํ–‰์€ ์ˆœ์„œ๋Œ€๋กœ ์ž…๋ ฅ๋˜๋Š” ๋ฌผ๊ฑด๋“ค์„ ๋œปํ•˜๊ณ , ์—ด์€ 1~k ๋ฌด๊ฒŒ๋ฅผ ๋œปํ•จ!
    1-2) ๋ฌด๊ฒŒ๋ฅผ 1๋ถ€ํ„ฐ k๊นŒ์ง€ ๋ชจ๋‘ ์ƒ์„ฑํ•ด์„œ ๋ณด๋Š” ์ด์œ ๋Š”, ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๋ฌด๊ฒŒ์— ๋”ฐ๋ฅธ ์ตœ๋Œ€ ๊ฐ€์น˜๋ฅผ
    ์ˆœ์„œ๋Œ€๋กœ ์—ฐ์‚ฐํ•˜๋ฉฐ ๊ฒฐ๊ตญ ๋งˆ์ง€๋ง‰์—๋Š” [n][k]์— ๋ˆ„์ ๋œ ๊ฐ’์œผ๋กœ ์ตœ๋Œ€ ๊ฐ€์น˜๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.
    1-3) ๋”ฐ๋ผ์„œ, ์•„๋ž˜์™€ ๊ฐ™์ด ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.
    ํ–‰ == ํ˜„์žฌ ๋ฌผ๊ฑด
    ์—ด == ๋ฐฐ๋‚ญ์— ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๋ฌด๊ฒŒ
    [ํ–‰][์—ด] == ํ˜„์žฌ ํ–‰๊นŒ์ง€์˜ ๋ฌผ๊ฑด๋“ค ์ค‘, ํ˜„์žฌ ์—ด์˜ ๋ฌด๊ฒŒ๊ฐ€ ์ตœ๋Œ€์ผ ๊ฒฝ์šฐ ๊ฐ€๋Šฅํ•œ ์ตœ๋Œ€ ๊ฐ€์น˜
    ๋”ฐ๋ผ์„œ, [n][k] = n๊ฐœ์˜ ๋ฌผ๊ฑด์ด ์žˆ๊ณ , ๋ฐฐ๋‚ญ์˜ ์ตœ๋Œ€ ๋ฌด๊ฒŒ๊ฐ€ k์ผ ๊ฒฝ์šฐ, ๊ฐ€๋Šฅํ•œ ์ตœ๋Œ€ ๊ฐ€์น˜!
  • 2. memory ๋ฆฌ์ŠคํŠธ์˜ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ๋„๋Š” 2์ค‘ for๋ฌธ์„ ์ƒ์„ฑํ–ˆ๋‹ค.
    2-1) j๊ฐ€ ํ˜„์žฌ w๋ณด๋‹ค ์ž‘์„ ๊ฒฝ์šฐ, ํ˜„์žฌ ๋ฌผ๊ฑด์€ ๋ฐฐ๋‚ญ์— ๋„ฃ์„ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ
    ์ด์ „ ๋ฌผ๊ฑด์˜ j์—ด์— ํ•ด๋‹นํ•˜๋Š” [i-1][j]์˜ ๊ฐ’์„ ๊ทธ๋Œ€๋กœ [i][j]์— ์ €์žฅํ•œ๋‹ค.
    2-2) j๊ฐ€ ํ˜„์žฌ w๋ณด๋‹ค ๊ฐ™๊ฑฐ๋‚˜ ํด ๊ฒฝ์šฐ, ํ˜„์žฌ ๋ฌผ๊ฑด์„ ๋ฐฐ๋‚ญ์— ๋„ฃ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ
    ํ˜„์žฌ ๋ฌผ๊ฑด์„ ๋ฐฐ๋‚ญ์— ๋„ฃ๋Š”๊ฒŒ ์ด๋“์ธ์ง€, ๋„ฃ์ง€ ์•Š๋Š”๊ฒŒ ์ด๋“์ธ์ง€ ๋”ฐ์ ธ๋ด์•ผ ํ•œ๋‹ค.
    2-3) [i-1][j]์™€ [i-1][j-w]+v ์ค‘์—์„œ ๋” ํฐ ์ˆ˜๊ฐ€ ์–ด๋–ค๊ฑด์ง€ ๋ณด๋ฉด ๋œ๋‹ค.
    ์—ฌ๊ธฐ์„œ ์ž ๊น,,! [i-1][j-w]+v ๋ผ๋Š” ์‹์ด ์–ด๋–ป๊ฒŒ ๋‚˜์™”๋ƒ๋ฉด,,
    ํ˜„์žฌ ๋ฌผ๊ฑด์„ ๋ฐฐ๋‚ญ์— ๋„ฃ๋Š”๋‹ค๋ฉด, ๋ฐฐ๋‚ญ์— ๋‚จ๋Š” ๋ฌด๊ฒŒ๋Š” j-w๋งŒํผ!!
    ๋”ฐ๋ผ์„œ ์ด์ „ ํ–‰์˜ j-w์— ํ•ด๋‹นํ•˜๋Š” ์ตœ๋Œ€ ๊ฐ€์น˜์—, ํ˜„์žฌ ๋ฌผ๊ฑด์˜ ๊ฐ€์น˜๋ฅผ ๋”ํ•ด์ค€ ๊ฐ’์ด
    ๋ฐ”๋กœ ํ˜„์žฌ ๋ฌผ๊ฑด์„ ๋ฐฐ๋‚ญ์— ๋„ฃ์—ˆ์„ ๋•Œ์˜ ๊ฐ€์น˜๊ฐ€ ๋œ๋‹ค.!
    ๋”ฐ๋ผ์„œ ์œ„์˜ ๋‘ ๊ฐ’์„ ๋น„๊ตํ•˜์—ฌ ๋” ํฐ ๊ฐ’์„ [i][j]์— ์ €์žฅํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
  • ์œ„์˜ 1, 2๋ฒˆ ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•˜๋ฉด memory[n][k]์— ๋ˆ„์ ๋œ ์ตœ๋Œ€ ๊ฐ€์น˜๊ฐ€ ์ €์žฅ๋˜๋ฏ€๋กœ,
    ํ•ด๋‹น ๊ฐ’์„ ์ถœ๋ ฅํ•ด์ฃผ๋ฉด ๋!

 

=> ์œ„์˜ ํ’€์ด ๊ณผ์ •์„ ๊ทธ๋ฆผ์œผ๋กœ ๋‚˜ํƒ€๋‚ด๋ดค๋‹ค.

memory ๋ฆฌ์ŠคํŠธ์— ๋ชจ๋“  ๊ฐ’์ด ์ €์žฅ๋œ ๋ชจ์Šต์„ ๊ทธ๋ ธ๊ณ ,

๋Œ€ํ‘œ๋กœ ๋ณผ ๋งŒํ•œ [4][7] ์ž๋ฆฌ์˜ ์š”์†Œ๊ฐ’์ด ๋“ค์–ด๊ฐ„ ๊ณผ์ •์„ ์ž์„ธํžˆ ์ž‘์„ฑํ–ˆ๋‹ค.

 

๐Ÿ’ก ํ”ผ๋“œ๋ฐฑ
  • ๋ฐฐ๋‚ญ ๋ฌธ์ œ๋ฅผ ์ฒ˜์Œ ํ’€์–ด๋ด์„œ ํ’€์ด๋ฅผ ์ดํ•ดํ•˜๋Š”๋ฐ์— ๊ต‰์žฅํžˆ ์˜ค๋ž˜๊ฑธ๋ ธ๋Š”๋ฐ,,! ์ดํ•ดํ•˜๋‹ˆ ๊ต‰์žฅํžˆ ์ฝ”๋“œ๋„ ์งง๊ณ ,, ๋‹จ์ˆœํ•œ? ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด์—ˆ๋‹ค.
  • ์ด๋Ÿฐ ์œ ํ˜•์˜ ๋ฌธ์ œ๋ฅผ ๋งŽ์ด ํ’€์–ด๋ด์•ผํ•  ๊ฒƒ ๊ฐ™๋‹ค.

 

 

๋Œ“๊ธ€