그런데, 지금 당장 터는게 이득일지, 안 터는게 이득일지를 그 순간 순간에 판단할 수 없다.
따라서 위 3가지 케이스를 계속해서 업데이트(동적)하면서 마지막에 훔칠 수 있는 최댓값을 반환하는게 맞다.
따라서 이 문제가 DP, 동적계획법으로 분류된 것이다.
def solution(money):
# 마지막 집을 포기하는 케이스
rob, cant, no = money[0], 0, 0
# 첫 집을 포기하는 케이스
rob2, cant2, no2 = money[1], 0, 0
for i in range(1, len(money)-1):
# 훔치려먼 이전에 못/안 훔쳐야한다는 뜻. "둘 중에 더 이익이 큰 루트"를 골라 새로운 이익을 추가
# 못 훔친다는 것은, "이전에 훔쳤다"는 뜻.
# 안 훔친다는 것은, "이전에 못 훔쳐서" 이번에는 훔칠 수 있지만, 참는다는 뜻이다.
rob, cant, no = money[i] + max(cant, no), rob, cant
rob2, cant2, no2 = money[i+1] + max(cant2, no2), rob2, cant2
return max(rob, cant, rob2, cant2)
참고로, 두 번 연속으로 "안 훔친다"라는 것은 있을 수 없다. 그것은 손해이다 😂