DP - 도둑질(Lv.4)

jisu_log·2025년 8월 8일

알고리즘 문제풀이

목록 보기
74/105


  • 도둑 문제 유형(인접한 집은 동시에 X)은 해당 집 털거나 안털거나!
    -> 점화식: dp[i] = max(dp[i - 1], dp[i - 2] + money[i])
    -> dp[i - 1]: 이번 집 안털고 이전까지 최댓값 유지
    -> dp[i - 2] + money[i]: 이번 집 털고, 전전 집까지의 최대값 더하기
  • 원형인 경우 2가지 케이스로 나눠 풀기:
    1) 첫 집 터는 경우 -> 마지막 집 털 수 없음
    2) 첫 집 안터는 경우 -> 마지막 집 털 수 있음
def solution(money):
    answer = -1
    m_len = len(money)
    
    # 1) 첫 집 털기 -> 마지막 집 못털음 ----
    money_1 = money[:m_len - 1]
    
    dp = [0] * (m_len) # dp[i] : i번째 집까지 털었을 때의 최대 수익
    dp[1] = money_1[0]
    
    for i in range(2, len(money_1) + 1):
        # 현재 집 i를 터는 경우와 안털고 직전 수익 이어받는 경우 중 큰 경우 채택
        dp[i] = max(money_1[i - 1] + dp[i - 2], dp[i - 1])
    
    max_1 = max(dp)
    
    
    # 2) 첫 집 안털기 -> 마지막 집 털 수 있음 ----
    money_2 = money[1:]
    
    dp = [0] * (m_len)
    dp[1] = money_2[0]
    
    for i in range(2, len(money_2) + 1):
        dp[i] = max(money_2[i - 1] + dp[i - 2], dp[i - 1])
    
    max_2 = max(dp)
    
    answer = max(max_1, max_2)

    return answer

0개의 댓글