백준 2579 - 계단 오르기 (Python3)
코드
import sys
input = sys.stdin.readline
n = int(input())
def stair_up(n):
# 누적 합을 더할 DP 테이블
d = [0] * (n+1)
score = [0] * (n+1)
# 인덱스를 편의상 통일시키기 위해 범위를 아래와 같이 설정
for i in range(1, n+1):
score[i] = int(input())
# 별도로 처리하지 않으면 IndexError 발생
if n == 1:
return score[1]
d[1] = score[1]
d[2] = d[1] + score[2]
for i in range(3, n+1):
d[i] = max(d[i-2] + score[i], d[i-3] + score[i-1] + score[i])
return d[n]
print(stair_up(n))
문제 해설
동적 프로그래밍 문제로 다른 동적 프로그래밍 문제들과 마찬가지로 점화식을 세워서 코드화 시키는 것이 가장 중요한 부분이다. 이 문제의 경우 문제의 조건으로 아래와 같이 주어졌다.
1. 맨 마지막 계단은 반드시 밟아야 함 2. 연속된 세 개의 계단을 밟을 수 없음 3. 한 번에 한 계단 또는 두 계단씩 오를 수 있음문제의 접근 방향을 첫 계단부터 마지막까지 올라가는 방향으로 생각하는 것보다 1번 조건에 따라 마지막 계단은 무조건 밟아야 하므로 마지막 계단에서부터 아래로 내려가는 방향으로 생각하여 점화식을 세웠다.
즉, 마지막 계단을 N번째 계단이라고 할 때, 여기에 도달할 수 있는 경우는 아래 두 가지와 같다.
-
N-2번째부터 한 번에 2계단을 올라온 경우
-
이 경우, 마지막 전 계단을 밟지 않은 경우가 된다
- 계단 위치 변화 : (N-2) -> n
- 마지막 계단을 밟기 전의 누적 합 : d[N-2]
-
-
N-3번째 전에 두 계단을 올라온 경우
-
이 경우, 마지막 전 계단을 밟은 경우가 된다
- 계단 위치 변화 : (N-3) -> (N-1) -> n
- 마지막 계단을 밝기 전의 누적 합 : d[N-3] + score[N-1]
-
위 두 경우 중 값이 더 큰 값이 정답이 된다.
댓글남기기