이것이 취업을 위한 코딩 테스트다 with 파이썬을 공부하면서 정리한 내용입니다.
문제 내용
- 개미 전사가 메뚜기 마을의 식량 창고를 몰래 공격하려고 함
- 메뚜기 마을에는 여러 개의 식량 창고가 일직선으로 이어져 있음
- 각 식량 창고에는 정해진 수의 식량을 저장하고 있으며 개미 전사는 식량 창고를 선택적으로 약탈할 예정
- 서로 인접한 식량 창고가 공격받으면 메뚜기 정찰병이 알아챌 수 있음
- 개미 전사가 정찰병에게 들키지 않고 식량 창고를 약탈하려면 최소한 한 칸 이상 떨어진 식량 창고를 약탈해야 함
- 식량 창고 N개에 대한 정보가 주어졌을 때 얻을 수 있는 식량의 최댓값을 구하는 프로그램 작성
입력 조건
- 첫째 줄에 식량 창고의 개수 N이 주어짐 (3≤N≤100)
- 둘째 줄에 공백으로 구분되어 각 식량 창고에 저장된 식량의 개수 K가 주어짐 (0≤K≤1,000)
출력 조건
- 첫째 줄에 개미 전사가 얻을 수 있는 식량의 최댓값 출력
입력 예시
4
1 3 1 5
출력 예시
8
문제 해설
- 왼쪽부터 차례대로 식량 창고를 턴다고 가정하면 쉽게 점화식을 세울 수 있음
- 왼쪽부터 차례대로 식량 창고를 털지 안 털지를 결정할 때와 특정한 i번째 식량 창고에 대해서 털지 안 털지의 여부를 결정할 때, 2가지 경우를 확인하면 됨
- (i−1)번째 식량 창고를 털기로 결정한 경우 현재의 식량 창고를 털 수 없음
- (i−2)번째 식량 창고를 털기로 결정한 경우 현재의 식량 창고를 털 수 있음
- 위 2가지 경우에서 더 많은 식량을 털 수 있는 경우를 선택하면 됨
- i번째 식량 창고에 대한 최적의 해를 구할 때 왼쪽부터 (i−3)번째 이하의 식량 창고에 대한 최적의 해에 대해서는 고려할 필요가 없음
d[i - 3]
는 d[i - 1]
과 d[i - 2]
을 구하는 과정에서 이미 계산되었기 때문에, d[i]
의 값을 구할 때는 d[i - 1]
과 d[i - 2]
만 고려하면 됨
- i번째 식량 창고에 있는 식량의 양이 ki라고 할 때 점화식은 다음과 같음
ai=max(ai−1,ai−2+k)
소스 코드
n = int(input())
array = list(map(int, input().split()))
d = [0] * 100
d[0] = array[0]
d[1] = max(array[0], array[1])
for i in range(2, n):
d[i] = max(d[i - 1], d[i - 2] + array[i])
print(d[n - 1])