Algorithm/ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ / Python] λ„λ‘‘μ§ˆ

meeeeejin 2021. 4. 6. 17:37

문제 링크: programmers.co.kr/learn/courses/30/lessons/42897

 

μ½”λ”©ν…ŒμŠ€νŠΈ μ—°μŠ΅ - λ„λ‘‘μ§ˆ

도둑이 μ–΄λŠ λ§ˆμ„μ„ ν„Έ κ³„νšμ„ ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 이 λ§ˆμ„μ˜ λͺ¨λ“  집듀은 μ•„λž˜ κ·Έλ¦Όκ³Ό 같이 λ™κ·Έλž—κ²Œ λ°°μΉ˜λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. 각 집듀은 μ„œλ‘œ μΈμ ‘ν•œ 집듀과 λ°©λ²”μž₯μΉ˜κ°€ μ—°κ²°λ˜μ–΄ 있기 λ•Œλ¬Έμ— μΈμ ‘ν•œ

programmers.co.kr

 

 

문제 μ„€λͺ…

도둑이 ν›”μΉ  수 μžˆλŠ” 돈의 μ΅œλŒ“κ°’μ„ μ €μž₯ν•˜λŠ” dp ν…Œμ΄λΈ”μ„ μƒμ„±ν•©λ‹ˆλ‹€. dp[i]λŠ” 1λ²ˆλΆ€ν„° i번째 μ§‘κΉŒμ§€ ν„Έμ—ˆμ„ λ•Œ ν›”μΉ  수 μžˆλŠ” 돈의 μ΅œλŒ“κ°’μž…λ‹ˆλ‹€.

 

λ§Œμ•½ 이전 집을 ν„Έμ—ˆλ‹€λ©΄ ν˜„μž¬ 집은 털지 λͺ»ν•˜λ―€λ‘œ dp[i]λŠ” (λ°”λ‘œ μ „ μ§‘κΉŒμ§€ ν›”μΉ  수 μžˆλŠ” μ΅œλŒ“κ°’)와 (μ „μ „μ§‘κΉŒμ§€μ˜ ν›”μΉ  수 μžˆλŠ” μ΅œλŒ“κ°’ + ν˜„μž¬ μ§‘μ˜ money) 두 가지 경우둜 λ‚˜λ‰©λ‹ˆλ‹€. 

 

dp[i] = max(dp[i - 1], dp[i - 2] + dp[i])

 

μ΄λ•Œ λ§ˆμ§€λ§‰ 집은 첫 번째 집과 λ°©λ²”μž₯μΉ˜κ°€ μ—°κ²°λ˜μ–΄ μžˆμœΌλ―€λ‘œ dpν…Œμ΄λΈ” 계산을 1번 집을 ν„Έ 경우/ μ•ˆ ν„Έ 경우둜 λ‚˜λˆ μ„œ μˆ˜ν–‰ν–ˆμŠ΅λ‹ˆλ‹€. 

 

1번 집을 ν„Έ 경우: 2λ²ˆλΆ€ν„° λ§ˆμ§€λ§‰ λ°”λ‘œ μ „ μ§‘κΉŒμ§€ ν›”μΉ  수 μžˆλŠ” 돈 계산(λ§ˆμ§€λ§‰ 집은 털지 λͺ»ν•¨)

1번 집을 털지 μ•Šμ„ 경우: 2λ²ˆλΆ€ν„° λ§ˆμ§€λ§‰ μ§‘κΉŒμ§€ ν›”μΉ  수 μžˆλŠ” 돈 계산

 

이후에 두 가지 경우 쀑 더 큰 값을 λ°˜ν™˜ν•©λ‹ˆλ‹€. 

 

 

 

 

μ†ŒμŠ€μ½”λ“œ

def solution(money):
    dp1 = [0] * len(money)
    dp2 = [0] * len(money)
    # 1번 집을 ν„°λŠ” 경우
    dp1[0] = money[0]
    for i in range(1, len(money) - 1):  # λ§ˆμ§€λ§‰ 집은 털지 λͺ»ν•¨
        dp1[i] = max(dp1[i - 1], dp1[i - 2] + money[i])
    # 1번 집을 μ•ˆν„°λŠ” 경우
    dp1[0] = 0
    for i in range(1, len(money)):
        dp2[i] = max(dp2[i - 1], dp2[i - 2] + money[i])

    return max(dp1[-2], dp2[-1])

 

 

 

 

 

728x90