테스트 케이스는 통과했지만 채점을 통과하지 못함.
문제점. 코드도 너무 복잡하게 짠 것 같고 배열이 홀수일 때도 0으로 바꾼(이웃집)빼고 비교해야하는데 코드를 이상하게 짠 것 같아서 다른 사람의 코드를 보기로 함.
def solution(money):
answer = 0
cnt = 0
if len(money) == 3:
answer = max(money)
elif len(money) % 2 == 0:
Odd = money[0::2]
Even = money[1::2]
if sum(Odd) >= sum(Even):
answer = sum(Odd)
else :
answer = sum(Even)
else :
for i in range(-1, len(money)-1):
if money[i] >= money[i+1]:
answer += money[i]
money[i] = 0
money[i+1] = 0
money[i-1] = 0
else :
answer += money[i+1]
money[i] = 0
money[i+1] = 0
money[i+2] = 0
return answer
나는 배열의 길이를 기준으로 (3일때, 홀수일때, 짝수일때) 나눠서 풀어야한다고 생각했는데 첫번째 집을 털 경우와 첫번째 집을 털지 않을 경우로 나눈다음 다 계산해본 뒤 비교해서 풀어야 하는 걸 깨달았다.
또, 다이나믹 프로그래밍에서는 dp테이블을 만들어서 푸는게 핵심인 것 같다.
🔗풀이 참고
https://inspirit941.tistory.com/161
def solution(money):
table = [0 for _ in range(len(money))]
# 첫 번째 집을 털 경우
table[0] = money[0]
table[1] = table[0]
for i in range(2, len(money) - 1):
table[i] = max(table[i-1], table[i-2] + money[i])
value = max(table)
# 첫 번째 집을 털지 않을 경우
table = [0 for _ in range(len(money))]
table[1] = money[1]
for i in range(2, len(money)):
table[i] = max(table[i-1], table[i-2] + money[i])
return max(value, max(table))
🔗프로그래머스 - 도둑질
https://programmers.co.kr/learn/courses/30/lessons/42897