ν‹°μŠ€ν† λ¦¬ λ·°

728x90
λ°˜μ‘ν˜•

문제

 

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

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

programmers.co.kr

 

문제 풀이

 μΈμ ‘ν•œ 두 집은 λ°©λ²”μž₯μΉ˜κ°€ μ—°κ²°λ˜μ–΄ ν„Έ 수 μ—†λ‹€λŠ” μ œν•œ 쑰건을 가지고 μžˆλ‹€. μ΄λ•Œ 집을 ν„Έμ–΄μ„œ κ°€μž₯ ν°λˆμ„ ν›”μΉ  수 μžˆλŠ” μ΅œλŒ“κ°’μ„ λ°˜ν™˜ν•˜λŠ” λ¬Έμ œμ΄λ‹€. 문제λ₯Ό ν’€κΈ° μœ„ν•΄μ„œλŠ” λ‹€μŒκ³Ό 같은 경우λ₯Ό μƒκ°ν•˜λ©΄ μ‰½κ²Œ ν•΄κ²°ν•  수 μžˆλ‹€.

 

  • 집 1개 : ν•΄λ‹Ή 집을 ν„°λŠ” 것이 μ΅œλŒ€ 값이닀.
  • 집 2개 : λ‘˜ 쀑에 `money`κ°€ 큰 것을 ν„°λŠ” 것이 μ΅œλŒ€ 값이닀.
  • 집 3개 : `i와 i - 2` λ˜λŠ” `i - 1` μ§‘μ˜ `money` 쀑 μ΅œλŒ€κ°’μΈ 경우λ₯Ό ν„°λŠ” 것이 μ΅œλŒ€μ΄λ‹€.
  • 집 3개 인 κ²½μš°μ—μ„œ μ•Œ 수 μžˆλ“―μ΄ 경우의 μˆ˜κ°€ λ‹€μ‹œ 2κ°€μ§€λ‘œ λ‚˜λ‰œλ‹€.
    • 첫 번째 집을 무쑰건 ν„°λŠ” 경우.
      • `dp[FIRST][0], dp[FIRST][1] = money[0], moeny[0]`둜 μ΄ˆκΈ°ν™” ν•œλ‹€.
    • λ§ˆμ§€λ§‰ 집을 무쑰건 ν„°λŠ” 경우.
      • `dp[LAST][0], dp[LAST][1] = 0, money[1]`둜 μ΄ˆκΈ°ν™” ν•œλ‹€.

 μœ„와 같은 경우λ₯Ό 톡해 집을 ν„Έ 수 μžˆλŠ” μ΅œλŒ€κ°’μ€ 점화식은 `dp[i] = max(dp[i - 1], money[i], dp[i - 2])`을 μœ μΆ”ν•  수 μžˆλ‹€.

 

μ½”λ“œ

FIRST, LAST = 0, 1


def solution(money):
    length = len(money)
    dp = [[0] * length for _ in range(2)]
    dp[FIRST][0], dp[FIRST][1] = money[0], money[0]
    dp[LAST][0], dp[LAST][1] = 0, money[1]

    for i in range(2, length):
        if i < length - 1:
            dp[FIRST][i] = max(dp[FIRST][i - 1], money[i] + dp[FIRST][i - 2])
        dp[LAST][i] = max(dp[LAST][i - 1], money[i] + dp[LAST][i - 2])

    return max(max(dp[FIRST]), max(dp[LAST]))

 

 

728x90
λ°˜μ‘ν˜•
λŒ“κΈ€
κΈ€ 보관함
μ΅œκ·Όμ— 올라온 κΈ€
μ΅œκ·Όμ— 달린 λŒ“κΈ€