ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [๋ฐฑ์ค€] 12920 ํ‰๋ฒ”ํ•œ ๋ฐฐ๋‚ญ 2 with Python
    PS 2022. 7. 1. 21:13
    728x90
    ๋ฐ˜์‘ํ˜•

    ๐Ÿ“Œ BOJ 12920 ํ‰๋ฒ”ํ•œ ๋ฐฐ๋‚ญ 2

    ๐Ÿ’ก ์กฐ๊ฑด

    1. ๋ฏผํ˜ธ๋Š” BOJ ์บ ํ”„์— ๊ฐ€๊ธฐ ์œ„ํ•ด ๊ฐ€๋ฐฉ์„ ์‹ธ๋ ค๊ณ  ํ•œ๋‹ค. ๊ฐ€๋ฐฉ์— ์–ด๋– ํ•œ ๋ฌผ๊ฑด๋“ค์„ ๋„ฃ๋ƒ์— ๋”ฐ๋ผ ๋ฏผํ˜ธ์˜ ๋งŒ์กฑ๋„๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค.
    1. ์ง‘์— ์žˆ๋Š” ๋ชจ๋“  ๋ฌผ๊ฑด๋“ค์„ ๋„ฃ์œผ๋ฉด ๋ฏผํ˜ธ๊ฐ€ ๋Š๋‚„ ์ˆ˜ ์žˆ๋Š” ๋งŒ์กฑ๋„๋Š” ์ตœ๋Œ€๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.
      ํ•˜์ง€๋งŒ ๋ฏผํ˜ธ๊ฐ€ ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋ฐฉ์˜ ๋ฌด๊ฒŒ๋Š” ์ •ํ•ด์ ธ ์žˆ์–ด ์ด๋ฅผ ์ดˆ๊ณผํ•ด ๋ฌผ๊ฑด์„ ๋„ฃ์„์ˆ˜๊ฐ€ ์—†๋‹ค.
    1. ๋ฏผํ˜ธ๊ฐ€ ๋งŒ์กฑ๋„๋ฅผ ์ตœ๋Œ€๋กœ ๋Š๋‚„ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ์ฐพ์•„๋ณด์ž.
      ๋‹จ, ์ง‘์— ๋™์ผํ•œ ๋ฌผ๊ฑด๋“ค์ด ์—ฌ๋Ÿฌ๊ฐœ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•œ ๋ฌผ๊ฑด์„ ๋‘๊ฐœ ์ด์ƒ ์ฑ™๊ธฐ๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.
    1. ์ฒซ ๋ฒˆ์งธ ์ค„์— N, M (1 โ‰ค N โ‰ค 100, 1 โ‰ค M โ‰ค 10,000) ์ด ๋นˆ์นธ์„ ๊ตฌ๋ถ„์œผ๋กœ ์ฃผ์–ด์ง„๋‹ค.
      N์€ ๋ฏผํ˜ธ์˜ ์ง‘์— ์žˆ๋Š” ๋ฌผ๊ฑด์˜ ์ข…๋ฅ˜์˜ ์ˆ˜์ด๊ณ  M์€ ๋ฏผํ˜ธ๊ฐ€ ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋ฐฉ์˜ ์ตœ๋Œ€ ๋ฌด๊ฒŒ๋‹ค.
    1. ๋‘ ๋ฒˆ์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— ๊ฑธ์ณ ๋ฏผํ˜ธ์˜ ์ง‘์— ์žˆ๋Š” ๋ฌผ๊ฑด์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.
      ๊ฐ์˜ ์ค„์€ V, C, K (1 โ‰ค V โ‰ค M, 1 โ‰ค C, K โ‰ค 10,000, 1 โ‰ค V * K โ‰ค 10,000) ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.
      V๋Š” ๋ฌผ๊ฑด์˜ ๋ฌด๊ฒŒ, C๋Š” ๋ฌผ๊ฑด์„ ๊ฐ€๋ฐฉ์— ๋„ฃ์—ˆ์„ ๋•Œ ์˜ฌ๋ผ๊ฐ€๋Š” ๋ฏผํ˜ธ์˜ ๋งŒ์กฑ๋„, K๋Š” ๋ฌผ๊ฑด์˜ ๊ฐœ์ˆ˜์ด๋‹ค.
    1. ์ตœ๋Œ€ ๋ฌด๊ฒŒ๋ฅผ ๋„˜๊ธฐ์ง€ ์•Š๊ฒŒ ๋ฌผ๊ฑด์„ ๋‹ด์•˜์„ ๋•Œ ๋ฏผํ˜ธ๊ฐ€ ๋Š๋‚„ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๋งŒ์กฑ๋„๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
    1. ๋ƒ…์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜, ๋น„ํŠธ๋งˆ์Šคํ‚น ์œ ํ˜•์˜ ๋ฌธ์ œ

    ๐Ÿ–ฅ ์†Œ์Šค ์ฝ”๋“œ

    N, M = map(int, input().split())
    
    dp = [0 for _ in range(M+1)]
    weight, satisfaction = [], []
    for _ in range(N):
        V, C, K = map(int, input().split())
    
        idx = 1
        while K > 0:
            tmp = min(idx, K)
    
            weight.append(V * tmp)
            satisfaction.append(C * tmp)
    
            idx *= 2
            K -= tmp
    
    for i in range(len(weight)):
        for j in range(M, 0, -1):
            if j >= weight[i]:
                dp[j] = max(dp[j], dp[j-weight[i]] + satisfaction[i])
    
    print(dp[M])

    ๐Ÿ”– ์˜ˆ์ œ ๋ฐ ์‹คํ–‰๊ฒฐ๊ณผ

    ์˜ˆ์ œ

    2 3
    2 7 1
    1 9 3

    ์‹คํ–‰๊ฒฐ๊ณผ

    27

    โŒจ๏ธ ๋ฌธ์ œ ํ’€์ด

    1. ํ‰๋ฒ”ํ•œ ๋ฐฐ๋‚ญ ๋ฌธ์ œ ์‹œ๋ฆฌ์ฆˆ์ด๋‹ค.
      ํ‰๋ฒ”ํ•œ ๋ฐฐ๋‚ญ 1 ๋ฌธ์ œ๋Š” ๋ƒ…์ƒ‰, DP ๋ฌธ์ œ์ด๋‹ค.
      ๋ฌผํ’ˆ์˜ ์ˆ˜ N, ๋ฒ„ํ‹ธ ์ˆ˜ ์žˆ๋Š” ๋ฌด๊ฒŒ K ๋ผ๊ณ  ํ•œ๋‹ค๋ฉด ์‹œ๊ฐ„๋ณต์žก๋„ O(NK)๋กœ ํ’€์ดํ•  ์ˆ˜ ์žˆ๋‹ค.
    1. ํ•˜์ง€๋งŒ ์ด ๋ฌธ์ œ๋Š” ๋ฌผ๊ฑด์˜ ๊ฐœ์ˆ˜๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ์ด๋‹ค. ์ฆ‰, ๋ฌผ๊ฑด์ด ์ค‘๋ณต์œผ๋กœ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
      ๋ฌผ๊ฑด์ด ์ค‘๋ณต์œผ๋กœ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, V = 1, M = 10000, K = 10000 ์ด๋ผ๊ณ  ํ•˜๋ฉด while ๋ฐ˜๋ณต๋ฌธ์ด ์•ฝ 1์–ต๋ฒˆ ๊ฐ€๊นŒ์ด ๋Œ๊ฒŒ ๋œ๋‹ค.
      ์ด๋Ÿฌ๋ฉด ๋ฌด์กฐ๊ฑด TLE. ๋˜ํ•œ ์ผ๋ฐ˜ ๋ƒ…์ƒ‰์—์„œ๋Š” 2์ฐจ์› ๋ฐฐ์—ด์„ ์ด์šฉํ–ˆ์ง€๋งŒ, ์ด ๋ฌธ์ œ์—์„œ๋Š” 1์ฐจ์› ๋ฐฐ์—ด๋กœ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค.
    1. O(NM * logK)๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ƒ๊ฐํ•ด๋ด์•ผํ•œ๋‹ค.
      ๋‹ค๋ฅธ ๋ถ„๋“ค์˜ ํ’€์ด๋ฅผ ํ™•์ธํ•˜๋‹ˆ, ๋น„ํŠธ๋งˆ์Šคํ‚น ์•„์ด๋””์–ด๋ฅผ ํ†ตํ•ด์„œ ์ˆ˜๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค.
      ์ด ์•„์ด๋””์–ด์˜ ํ•ต์‹ฌ์€ ๋ชจ๋“  ์ˆ˜๋Š” 2์˜ ์ œ๊ณฑ์ˆ˜๋“ค์˜ ํ•ฉ์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
    1. ๋งŒ์•ฝ ๊ฐ™์€ ๋ฌผ๊ฑด์ด ์•ฝ 15๊ฐœ๋ผ๊ณ  ํ•œ๋‹ค๋ฉด ์ด๋ฅผ 2์˜ ์ œ๊ณฑ์ˆ˜๋“ค์˜ ํ•ฉ์œผ๋กœ ํ‘œํ˜„ํ–ˆ์„ ๋•Œ, 1 + 2 + 4 + 8 ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
      ๊ทธ๋ ‡๋‹ค๋ฉด DP ํ…Œ์ด๋ธ”์— 1๊ฐœ, 2๊ฐœ, 4๊ฐœ, 8๊ฐœ ์ถ”๊ฐ€ํ•œ ๊ฒฝ์šฐ๋ฅผ ๊ฐฑ์‹ ์‹œ์ผœ์ฃผ๋ฉด ๋œ๋‹ค.
    1. DP ํ…Œ์ด๋ธ”์„ M + 1 ๊ฐœ ๋งŒ๋“ค์–ด์ฃผ๊ณ , ๋ฌด๊ฒŒ์™€ ๋งŒ์กฑ๋„๋ฅผ ์ €์žฅํ•  ๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
    1. ๋ฐ˜๋ณต๋ฌธ์„ N๋ฒˆ ์ˆœํšŒํ•˜๋ฉด์„œ ๋ฌผ๊ฑด์˜ ๋ฌด๊ฒŒ(V), ๋งŒ์กฑ๋„(C), ๋ฌผ๊ฑด์˜ ๊ฐœ์ˆ˜(K)๋ฅผ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค.
      ์ž…๋ ฅ๋ฐ›์€ ๋ฌผ๊ฑด์„ ํ•œ๊ฐœ ๋„ฃ์—ˆ์„ ๊ฒฝ์šฐ๋ถ€ํ„ฐ 2 ๋ฅผ ๊ณฑํ•˜๋ฉด์„œ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ๊ฐœ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๋ฉด์„œ ๋งŒ์กฑ๋„์™€ ๋ฌด๊ฒŒ๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค.
      ๊ณ„์‚ฐํ•œ ๊ฐ ๊ฐ’์„ weight, satisfaction ๋ฆฌ์ŠคํŠธ์— ๋„ฃ์–ด์ค€๋‹ค. idx๋Š” 2๋ฅผ ๊ณฑํ•ด 2์˜ ์ œ๊ณฑ์ˆ˜๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค.
      ์ด๋ฏธ ๊ณ„์‚ฐํ•œ 2์˜ ์ œ๊ณฑ์ˆ˜๋Š” ์ œ์™ธํ•  ์ˆ˜ ์žˆ๋„๋ก K์—์„œ tmp๋ฅผ ๋นผ์ค€๋‹ค.
    1. ์ดํ›„์˜ ํ’€์ด๋Š” ๋ƒ…์ƒ‰์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๊ฐ™๋‹ค.
      weight ๋ฆฌ์ŠคํŠธ์˜ ๊ธธ์ด๋งŒํผ for ๋ฌธ์„ ์ˆœํšŒ(i)ํ•˜๊ณ , ๋“ค ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๋ฌด๊ฒŒ(M)๋ถ€ํ„ฐ 1๊นŒ์ง€ -1์”ฉ ๋‚ด๋ ค๊ฐ€๋ฉด์„œ ์ˆœํšŒ(j)ํ•œ๋‹ค.
    1. ์ด ๋•Œ, j๋งŒํผ ๋ฌด๊ฒŒ๋ฅผ ๋“ค ์ˆ˜ ์žˆ์„ ๋•Œ, weight ๋ฆฌ์ŠคํŠธ์˜ i๋ฒˆ์งธ์— ํ•ด๋‹นํ•˜๋Š” ๋ฌผ๊ฑด์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค๋ฉด dp[j]๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ฐฑ์‹ ํ•œ๋‹ค.
      dp[j] = max(dp[j], dp[j-weight[i]] + satisfaction[i])
    1. dp[j] ์งธ์˜ ๊ฐ’๊ณผ (dp[ํ˜„์žฌ ๋“ค ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€๋ฌด๊ฒŒ - i๋ฒˆ์งธ ๋ฌผ๊ฑด์˜ ๋ฌด๊ฒŒ] + i๋ฒˆ์งธ ๋ฌผ๊ฑด์˜ ๋งŒ์กฑ๋„) ๋ฅผ ๋น„๊ตํ•˜์—ฌ ๊ฐฑ์‹ ํ•œ๋‹ค.

    ๐Ÿ’พ ๋ฐฐ์šด์ 

    1. ์•ˆ๊ทธ๋ž˜๋„ ์–ด๋ ค์šด ๋ƒ…์ƒ‰์—์„œ ๋น„ํŠธ๋งˆ์Šคํฌ์˜ ๊ฐœ๋…์ด ๋“ค์–ด๊ฐ€๋‹ˆ ๋งค์šฐ ์–ด๋ ค์› ๋‹ค.
    1. ๋ƒ…์ƒ‰๋„ ๋ƒ…์ƒ‰์ด์ง€๋งŒ, ๋ชจ๋“  ์ž์—ฐ์ˆ˜๊ฐ€ 2์˜ ๊ฑฐ๋“ญ์ œ๊ณฑ ์ˆ˜๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ์•„์ด๋””์–ด๋Š” ์ƒ๊ฐ์น˜๋„ ๋ชปํ–ˆ๋‹ค.
    1. (2)๋ฒˆ์˜ ์•„์ด๋””์–ด๋ฅผ ๊ธฐ์–ตํ•˜๊ณ  ๋‚˜์ค‘์— ๊ผญ ์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ๋ฌธ์ œ์—์„œ ์ ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ๊ฒ ๋‹ค.
    ๋ฐ˜์‘ํ˜•

    ๋Œ“๊ธ€

Designed by Tistory.