money | return |
---|---|
[1, 2, 3, 1] | 4 |
: dp이용.
인접한 것을 함께 털지 못하기 때문에, dp[i-1], dp[i-2]+현재 중 max값을 현재 dp에 저장하면 된다.
원형이기 때문에 첫번째 원소와 마지막 원소도 인접한데 이는 어떻게 처리할까?
첫번째 집을 무조건 터는 경우와 털지 않는 경우로 나눈다.
- 첫번째 집을 무조건 터는 경우 - 마지막 집은 무조건 털지 못한다.
- 첫번째 집을 안터는 경우 - 마지막 집은 털 수도 있고 안털수도 있다.
-> 두 경우 중 최댓값을 리턴하면 된다.
def solution(money):
n = len(money)
dpA = [0]*n
dpB = [0]*n
# 첫번째o, 마지막은 털 수x
dpA[0] = money[0]
dpA[1] = money[0]
for i in range(2, n-1):
dpA[i] = max(dpA[i-1], dpA[i-2]+money[i])
dpA[-1] = dpA[-2]
# 첫번째x, 마지막은 털 수도 있고 안 털수도 있고
dpB[0] = 0
dpB[1] = money[1]
for i in range(2, n):
dpB[i] = max(dpB[i-1], dpB[i-2]+money[i])
# 두 경우 중 최댓값
return max(dpA[-1], dpB[-1])