sm 기술 블로그

132. 2579(계단 오르기) 본문

문제/백준_파이썬

132. 2579(계단 오르기)

sm_hope 2022. 7. 4. 21:20
import sys
input = sys.stdin.readline

N = int(input())
stair = list(int(input()) for _ in range(N))
dp = []
try:
    dp.append(stair[0]) #dp[0]
    dp.append(max(stair[0]+stair[1], stair[1])) #dp[1]
    dp.append(max(stair[0]+stair[2], stair[1]+stair[2])) #dp[2]

    for i in range(3, N):
        dp.append(max(dp[i-3]+stair[i-1]+stair[i], dp[i-2]+stair[i]))
except:
    sum = 0
    for val in stair:
        sum += val
    dp.append(sum)

print(dp.pop())

문제요약

마지막 계단을 올랐을 때 최대값을 구하라.

조건 1. 연속 세개의 계단을 올라갈 수 없다.

조건 2. 마지막 계단은 반드시 밟아야 한다.

설명

그림으로 큰 틀은 이해가 될 것이다.

    dp.append(stair[0]) #dp[0]
    dp.append(max(stair[0]+stair[1], stair[1])) #dp[1]
    dp.append(max(stair[0]+stair[2], stair[1]+stair[2])) #dp[2]

 

어쩔 수 없이 dp[0],dp[1],dp[2] 는 따로 계산이 필요하다. 

dp.append(max(dp[i-3]+stair[i-1]+stair[i], dp[i-2]+stair[i]))

 

 

네번째 계단부터는 비교가 가능하다.

직전칸에서 올라온 경우와, 전전칸에서 올라온 경우를 따져 가장 큰 수를 더해나가면 된다.

의문점

 

1. 입력값이 7이 었다면?

dp에서는 각 계단별로 최댓값을 가지고 있다.

따라서 7에서 다시 위와 같은 식을 사용해서 계산을 할 수 있다.

 

2. 계산하는 계단의(dp) 최댓값이 직전칸에서 올라온 경우의 최댓값이었다면?

위와 같은 사고를 방지하기 위해서 dp[i-3] 혹은 dp[i-2]로 계산한다.

따라서 전 계단의 dp를 사용하지 않아 위와같은 오류가 나올 수가 없다.

 

주의점

계단수가 2칸까지 나올 수 있다.

따라서 이에 대한 처리가 따로 필요하다.

예외 처리를 통해 2칸일 경우는 따로 값을 받는 방법을 채택하였다.

 

[출처]https://daimhada.tistory.com/181

 

 

'문제 > 백준_파이썬' 카테고리의 다른 글

135. 2156(포도주 시식)  (0) 2022.07.08
133. 1463(1로 만들기)  (0) 2022.07.04
131. 1932(정수 삼각형)  (0) 2022.07.03
130. 1149(RGB 거리)  (0) 2022.07.03
129. 1912(연속합)  (0) 2022.07.03
Comments