이것이 취업을 위한 코딩 테스트다 with 파이썬을 공부하면서 정리한 내용입니다.


문제 내용

  • 개미 전사가 메뚜기 마을의 식량 창고를 몰래 공격하려고 함
  • 메뚜기 마을에는 여러 개의 식량 창고가 일직선으로 이어져 있음
  • 각 식량 창고에는 정해진 수의 식량을 저장하고 있으며 개미 전사는 식량 창고를 선택적으로 약탈할 예정
  • 서로 인접한 식량 창고가 공격받으면 메뚜기 정찰병이 알아챌 수 있음
  • 개미 전사가 정찰병에게 들키지 않고 식량 창고를 약탈하려면 최소한 한 칸 이상 떨어진 식량 창고를 약탈해야 함
  • 식량 창고 N개에 대한 정보가 주어졌을 때 얻을 수 있는 식량의 최댓값을 구하는 프로그램 작성

입력 조건

  • 첫째 줄에 식량 창고의 개수 N이 주어짐 (3N100)(3 \le N \le 100)
  • 둘째 줄에 공백으로 구분되어 각 식량 창고에 저장된 식량의 개수 K가 주어짐 (0K1,000)(0 \le K \le 1,000)

출력 조건

  • 첫째 줄에 개미 전사가 얻을 수 있는 식량의 최댓값 출력

입력 예시

4
1 3 1 5

출력 예시

8

문제 해설

  • 왼쪽부터 차례대로 식량 창고를 턴다고 가정하면 쉽게 점화식을 세울 수 있음
  • 왼쪽부터 차례대로 식량 창고를 털지 안 털지를 결정할 때와 특정한 ii번째 식량 창고에 대해서 털지 안 털지의 여부를 결정할 때, 2가지 경우를 확인하면 됨
    • (i1)(i - 1)번째 식량 창고를 털기로 결정한 경우 현재의 식량 창고를 털 수 없음
    • (i2)(i - 2)번째 식량 창고를 털기로 결정한 경우 현재의 식량 창고를 털 수 있음
  • 위 2가지 경우에서 더 많은 식량을 털 수 있는 경우를 선택하면 됨
  • ii번째 식량 창고에 대한 최적의 해를 구할 때 왼쪽부터 (i3)(i - 3)번째 이하의 식량 창고에 대한 최적의 해에 대해서는 고려할 필요가 없음
  • d[i - 3]d[i - 1]d[i - 2]을 구하는 과정에서 이미 계산되었기 때문에, d[i]의 값을 구할 때는 d[i - 1]d[i - 2]만 고려하면 됨
  • ii번째 식량 창고에 있는 식량의 양이 kik_i라고 할 때 점화식은 다음과 같음
    ai=max(ai1,ai2+k)a_i = max(a_{i-1}, a_{i-2} + k)

소스 코드

# 정수 N을 입력받기
n = int(input())
# 모든 식량 정보 입력받기
array = list(map(int, input().split()))

# 앞서 계산된 결과를 저장하기 위한 DP 테이블 초기화
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])
profile
전부인 것처럼, 전부가 아닌 것처럼

0개의 댓글