Algorithm Problem/Python

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

deo2kim 2020. 9. 12. 20:41
λ°˜μ‘ν˜•

πŸ€”λ¬Έμ œ ν•΄κ²°

Lv4 | DP

 

"μΈμ ‘ν•œ 집은 ν„Έ 수 μ—†λ‹€" κΉŒμ§€λŠ” 크게 μ–΄λ €μš΄ λ¬Έμ œκ°€ μ•„λ‹ˆμ§€λ§Œ

"λ§ˆμ„μ΄ μ›ν˜•μœΌλ‘œ λ˜μ–΄ μžˆλ‹€" μ—μ„œ ν•œλ²ˆ 더 μƒκ°ν•˜κ²Œ ν•˜λŠ” 문제!!

-> 0번째 집을 ν„°λŠ” 경우( λ§ˆμ§€λ§‰ 집을 털지 λͺ»ν•œλ‹€ )와 0번째 집을 μ•ˆν„°λŠ” 경우 λ‘κ°€μ§€λ‘œ λ‚˜λˆŒ 수 μžˆλ‹€.

 

λ¨Όμ € 0λ²ˆμ§‘μ„ ν„Έ 경우!

  • 0λ²ˆμ§‘μ— 듀렀을 λ•Œ κ°€μž₯ λ§Žμ€ λˆμ„ κ°€μ Έμ˜€λŠ” κ²½μš°λŠ” 0λ²ˆμ§‘μ„ ν„΄λ‹€. dp[0] = money[0]
  • 1λ²ˆμ§‘μ— 듀렀을 λ•Œ κ°€μž₯ λ§Žμ€ λˆμ„ κ°€μ Έμ˜€λŠ” κ²½μš°λŠ” 1λ²ˆμ§‘μ„ ν„°λŠ” κ²½μš°μ§€λ§Œ μš°λ¦¬λŠ” 1λ²ˆμ§‘μ„ λ°˜λ“œμ‹œ ν„Έμ—ˆλ‹€κ³  κ°€μ •ν–ˆμœΌλ―€λ‘œ μΈμ ‘ν•œ 2λ²ˆμ§‘μ€ ν„Έ 수 μ—†λ‹€. dp[1] = 0
  • 2λ²ˆμ§‘μ— 듀렀을 λ•Œ: μΈμ ‘ν•œ 1λ²ˆμ§‘μ΄ μ•„λ‹Œ 0λ²ˆμ§‘ λ˜λŠ” -1λ²ˆμ§‘(2번일 λ•ŒλŠ” μ—†λ‹€) 쀑 λˆμ„ 많이 κ°€μ Έμ™”λ˜ μ§‘μ—μ„œ μ˜¨λ‹€.
    dp[2] = money[i] + max(dp[i-2], dp[i-1])
  • λ§ˆμ§€λ§‰μœΌλ‘œ n번째 집은 μ—†λ‹€κ³  κ°€μ •ν•΄μ•Όν•œλ‹€. (1λ²ˆμ§‘μ„ ν„Έμ—ˆμœΌλ―€λ‘œ 1번과 μΈμ ‘ν•œ nλ²ˆμ§‘μ€ ν„Έλ©΄ μ•ˆλ¨!!)

λ‹€μŒ 0λ²ˆμ§‘μ„ μ•ˆν„°λŠ” 경우!

  • 0λ²ˆμ§‘μ„ 털지 μ•ŠμœΌλ―€λ‘œ dp[0] = 0
  • 0λ²ˆμ§‘ μ•ˆν„Έμ—ˆμœΌλ‹ˆ 1λ²ˆμ§‘μ€ 탄닀. dp[1] = money[1]

πŸ’¨

πŸ’»μ†ŒμŠ€ μ½”λ“œ

def solution(money):
    answer = 0
    n = len(money)
    # 0λ²ˆμ§‘ ν„ΈκΈ°
    dp1 = [0] * (n - 1)
    dp1[0] = money[0]
    dp1[1] = 0
    for i in range(2, n - 1):
        dp1[i] = money[i] + max(dp1[i - 2], dp1[i - 3])

    # 0λ²ˆμ§‘ μ•ˆν„ΈκΈ°
    dp2 = [0] * (n)
    dp2[0] = 0
    dp2[1] = money[1]
    for i in range(2, n):
        dp2[i] = money[i] + max(dp2[i - 2], dp2[i - 3])

    answer = max(max(dp1), max(dp2))
    return answer

 

 

πŸ“•λ¬Έμ œ 확인

좜처: ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

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

 

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

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

programmers.co.kr


문제 μ„€λͺ…

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

각 집듀은 μ„œλ‘œ μΈμ ‘ν•œ 집듀과 λ°©λ²”μž₯μΉ˜κ°€ μ—°κ²°λ˜μ–΄ 있기 λ•Œλ¬Έμ— μΈμ ‘ν•œ 두 집을 ν„Έλ©΄ 경보가 μšΈλ¦½λ‹ˆλ‹€.

각 집에 μžˆλŠ” 돈이 λ‹΄κΈ΄ λ°°μ—΄ moneyκ°€ μ£Όμ–΄μ§ˆ λ•Œ, 도둑이 ν›”μΉ  수 μžˆλŠ” 돈의 μ΅œλŒ“κ°’μ„ return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μž‘μ„±ν•˜μ„Έμš”.

μ œν•œμ‚¬ν•­

  • 이 λ§ˆμ„μ— μžˆλŠ” 집은 3개 이상 1,000,000개 μ΄ν•˜μž…λ‹ˆλ‹€.
  • money λ°°μ—΄μ˜ 각 μ›μ†ŒλŠ” 0 이상 1,000 μ΄ν•˜μΈ μ •μˆ˜μž…λ‹ˆλ‹€.

μž…μΆœλ ₯ 예

money return
[1, 2, 3, 1] 4
λ°˜μ‘ν˜•