Algorithm Problem/Python

[python] ๋ฐฑ์ค€ - 1495. ๊ธฐํƒ€๋ฆฌ์ŠคํŠธ

deo2kim 2020. 8. 24. 08:00
๋ฐ˜์‘ํ˜•

๐Ÿค”๋ฌธ์ œ ํ•ด๊ฒฐ

1. S1 | ๋‹ค์ด๋‚˜๋ฏนํ”„๋กœ๊ทธ๋ž˜๋ฐ

2. ๊ฐ๊ฐ์˜ ์—ฐ์ฃผ ์ฐจ๋ก€์— ๊ฐ€๋Šฅํ•œ ๋ณผ๋ฅจ์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด 2์ฐจ์› ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ ๋‹ค.

3. ๋ฆฌ์ŠคํŠธ๋ฅผ ์„ค๋ช…ํ•˜์ž๋ฉด ๋งจ ์ฒซ์ค„(i = 0)์€ ์—ฐ์ฃผ ์‹œ์ž‘์ „ ๋‹จ๊ณ„์ด๊ณ  ๊ฐ’์ด 0์ด ์•„๋‹ˆ๋ผ 1์ธ ๋ถ€๋ถ„์€ ๋‚ด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ณผ๋ฅจ์ด๋‹ค. ํ˜„์žฌ ํ…Œ์ŠคํŠธ์ผ€์ด์Šค ์˜ˆ์‹œ(S=5)๋กœ ์ž‘์„ฑ๋์œผ๋ฏ€๋กœ [0][5] = 1 ์ด๋‹ค.

4. ํ…Œ์ŠคํŠธ์ผ€์ด์Šค: ์‹œ์ž‘๊ฐ’ 5, ์ตœ๋Œ€๊ฐ’ 10, ์—ฐ์ฃผ๋ฆฌ์ŠคํŠธ = [5, 3, 7]

5. ์ฒซ๋ฒˆ์งธ ์—ฐ์ฃผ๋ฅผ ํ•˜๊ธฐ ์ „์— ๋ณผ๋ฅจ์„ ๋ฐ”๊พผ๋‹ค. ํ˜„์žฌ ๋ณผ๋ฅจ์€ 5, ์ฒซ๋ฒˆ์งธ ์—ฐ์ฃผ ๋ณผ๋ฅจ์€ 5 ์ด๋ฏ€๋กœ 5+5 = 10, 5-5 = 0 ์œผ๋กœ ๋‘˜๋‹ค 0๋ณด๋‹ค ํฌ๊ณ  10๋ณด๋‹ค ์ž‘์œผ๋ฏ€๋กœ ์•„๋ž˜์™€ ๊ฐ™์ด ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

6. ์ฒซ๋ฒˆ์งธ ์—ฐ์ฃผ๋ฅผ ํ•˜๊ธฐ ์ „์— ๋ณผ๋ฅจ์„ ๋ฐ”๊พผ๋‹ค. ์ฒซ๋ฒˆ์งธ์™€ ๋‹ค๋ฅธ์ ์€ ํ˜„์žฌ ๋ณผ๋ฅจ์ด 2๊ฐ€์ง€(0๊ณผ 10)์ด๋‹ค. ๋จผ์ € ํ˜„์žฌ ๋ณผ๋ฅจ์€ 0, ๋‘๋ฒˆ์งธ ๋ณผ๋ฅจ์€ 3 ์ด๋ฏ€๋กœ 0+3 = 3, 0-3 = -3 ์œผ๋กœ 3๋งŒ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค์Œ ํ˜„์žฌ ๋ณผ๋ฅจ์€ 10, ๋‘๋ฒˆ์งธ ๋ณผ๋ฅจ์€ 3 ์ด๋ฏ€๋กœ 10+3 = 13, 10-3 = 7 ์œผ๋กœ 7๋งŒ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค.

7. ์ด๋ ‡๊ฒŒ ํ•˜๋‹ค๋ณด๋ฉด ๋งˆ์ง€๋ง‰์—๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ๋‚˜์˜ค๊ฒŒ ๋˜๊ณ  ๋งˆ์ง€๋ง‰ ํ–‰์—์„œ ๊ฐ’์ด 1์ธ ๊ฐ€์žฅ ํฐ ์ธ๋ฑ์Šค๋ฅผ ์„ ํƒํ•˜์—ฌ ์ถœ๋ ฅํ•œ๋‹ค.
๋งŒ์•ฝ ๊ฐ’์ด 1์ธ ๋ถ€๋ถ„์ด ์—†๋‹ค๋ฉด -1(๋งˆ์ง€๋ง‰ ์—ฐ์ฃผ๋ฅผ ๋ชปํ•  ๊ฒฝ์šฐ)๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

๐Ÿ’จ ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ํ•ญ์ƒ ์–ด๋ ต๋‹ค. ๋จผ์ € ์žฌ๊ท€๋กœ ํ’€์–ด๋ดค๋”๋‹ˆ ์—ญ์‹œ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. 

 

๐Ÿ’ป์†Œ์Šค ์ฝ”๋“œ

def volume():
    for i in range(1, N + 1):
        for j in range(M + 1):
            # print(i, j)
            # ํ˜„์žฌ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ณผ๋ฅจ(๊ฐ’์ด 1์ธ ๊ฒฝ์šฐ)์—์„œ๋งŒ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค!
            if dp[i - 1][j] == 0:
                continue
            # ๋ณผ๋ฅจ์„ ์˜ฌ๋ฆฌ๋Š” ๊ฒฝ์šฐ
            if j + V[i - 1] <= M:
                dp[i][j + V[i - 1]] = 1
            # ๋ณผ๋ฅจ์„ ๋‚ด๋ฆฌ๋Š” ๊ฒฝ์šฐ
            if j - V[i - 1] >= 0:
                dp[i][j - V[i - 1]] = 1

            # for row in dp:
            #     print(row)
            # print()


def answer():
    # ๋งˆ์ง€๋ง‰์ค„์— ๋ณผ๋ฅจ(๊ฐ’์ด1) ์ด ์žˆ์–ด์•ผ ์—ฐ์ฃผ๊ฐ€ ๊ฐ€๋Šฅํ•œ ๊ฒƒ!!! ์•„๋‹ˆ๋ฉด -1์„ ์ถœ๋ ฅ
    for i in range(M, -1, -1):
        if dp[-1][i] == 1:
            print(i)
            return
    else:
        print(-1)


if __name__ == "__main__":
    N, S, M = map(int, input().split())
    V = list(map(int, input().split()))
    # ์ตœ๋Œ€๋ณผ๋ฅจ(M)๊นŒ์ง€ ๊ฐ ๋…ธ๋ž˜๋งˆ๋‹ค ๊ฐ€๋Šฅํ•œ ๋ณผ๋ฅจ ์ €์žฅ
    dp = [[0] * (M + 1) for _ in range(N + 1)]
    # 0๋ฒˆ์งธ ํ–‰์€ ๋…ธ๋ž˜ ์‹œ์ž‘์ „
    # 1๋ฒˆ์งธ ํ–‰๋ถ€ํ„ฐ ์ฒซ ๋…ธ๋ž˜ ์‹œ์ž‘
    dp[0][S] = 1

    # ๊ฐ€๋Šฅํ•œ ๋ณผ๋ฅจ ์ €์žฅ ํ•˜๊ธฐ
    volume()
    # ๋งˆ์ง€๋ง‰ ์—ฐ์ฃผ ๋•Œ์˜ ๊ฐ€์žฅ ํฐ ๋ณผ๋ฅจ
    answer()

 

๐Ÿ“•๋ฌธ์ œ ํ™•์ธ

์ถœ์ฒ˜: BACKJOON ONLINE JUDGE

๋งํฌ: https://www.acmicpc.net/problem/1495

 

1495๋ฒˆ: ๊ธฐํƒ€๋ฆฌ์ŠคํŠธ

์ฒซ์งธ ์ค„์— N, S, M์ด ์ฃผ์–ด์ง„๋‹ค. (1 ≤ N ≤ 100, 1 ≤ M ≤ 1000, 0 ≤ S ≤ M) ๋‘˜์งธ ์ค„์—๋Š” ๊ฐ ๊ณก์ด ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ์ค„ ์ˆ˜ ์žˆ๋Š” ๋ณผ๋ฅจ์˜ ์ฐจ์ด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ด ๊ฐ’์€ 1๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , M๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™๋‹ค.

www.acmicpc.net




๋ฌธ์ œ

Day Of Mourning์˜ ๊ธฐํƒ€๋ฆฌ์ŠคํŠธ ๊ฐ•ํ† ๋Š” ๋‹ค๊ฐ€์˜ค๋Š” ๊ณต์—ฐ์—์„œ ์—ฐ์ฃผํ•  N๊ฐœ์˜ ๊ณก์„ ์—ฐ์ฃผํ•˜๊ณ  ์žˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ๊ณต์—ฐ๊ณผ๋Š” ๋‹ค๋ฅธ ๊ณต์—ฐ์„ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด์„œ ์ด๋ฒˆ ๊ณต์—ฐ์—์„œ๋Š” ๋งค๋ฒˆ ๊ณก์ด ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ๋ณผ๋ฅจ์„ ๋ฐ”๊พธ๊ณ  ์—ฐ์ฃผํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

๋จผ์ €, ๊ณต์—ฐ์ด ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ๊ฐ๊ฐ์˜ ๊ณก์ด ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š” ๋ณผ๋ฅจ์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค. ์ด ๋ฆฌ์ŠคํŠธ๋ฅผ V๋ผ๊ณ  ํ–ˆ์„ ๋•Œ, V[i]๋Š” i๋ฒˆ์งธ ๊ณก์„ ์—ฐ์ฃผํ•˜๊ธฐ ์ „์— ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š” ๋ณผ๋ฅจ์„ ์˜๋ฏธํ•œ๋‹ค. ํ•ญ์ƒ ๋ฆฌ์ŠคํŠธ์— ์ ํžŒ ์ฐจ์ด๋กœ๋งŒ ๋ณผ๋ฅจ์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ํ˜„์žฌ ๋ณผ๋ฅจ์ด P์ด๊ณ  ์ง€๊ธˆ i๋ฒˆ์งธ ๊ณก์„ ์—ฐ์ฃผํ•˜๊ธฐ ์ „์ด๋ผ๋ฉด, i๋ฒˆ ๊ณก์€ P+V[i]๋‚˜ P-V[i] ๋กœ ์—ฐ์ฃผํ•ด์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ, 0๋ณด๋‹ค ์ž‘์€ ๊ฐ’์œผ๋กœ ๋ณผ๋ฅจ์„ ๋ฐ”๊พธ๊ฑฐ๋‚˜, M๋ณด๋‹ค ํฐ ๊ฐ’์œผ๋กœ ๋ณผ๋ฅจ์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๋‹ค.

๊ณก์˜ ๊ฐœ์ˆ˜ N๊ณผ ์‹œ์ž‘ ๋ณผ๋ฅจ S, ๊ทธ๋ฆฌ๊ณ  M์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ๋งˆ์ง€๋ง‰ ๊ณก์„ ์—ฐ์ฃผํ•  ์ˆ˜ ์žˆ๋Š” ๋ณผ๋ฅจ ์ค‘ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ๋ชจ๋“  ๊ณก์€ ๋ฆฌ์ŠคํŠธ์— ์ ํžŒ ์ˆœ์„œ๋Œ€๋กœ ์—ฐ์ฃผํ•ด์•ผ ํ•œ๋‹ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— N, S, M์ด ์ฃผ์–ด์ง„๋‹ค. (1 ≤ N ≤ 100, 1 ≤ M ≤ 1000, 0 ≤ S ≤ M) ๋‘˜์งธ ์ค„์—๋Š” ๊ฐ ๊ณก์ด ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ์ค„ ์ˆ˜ ์žˆ๋Š” ๋ณผ๋ฅจ์˜ ์ฐจ์ด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ด ๊ฐ’์€ 1๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , M๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ๊ฐ€๋Šฅํ•œ ๋งˆ์ง€๋ง‰ ๊ณก์˜ ๋ณผ๋ฅจ ์ค‘ ์ตœ๋Œ“๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค. ๋งŒ์•ฝ ๋งˆ์ง€๋ง‰ ๊ณก์„ ์—ฐ์ฃผํ•  ์ˆ˜ ์—†๋‹ค๋ฉด (์ค‘๊ฐ„์— ๋ณผ๋ฅจ ์กฐ์ ˆ์„ ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด) -1์„ ์ถœ๋ ฅํ•œ๋‹ค.

๋ฐ˜์‘ํ˜•