[백준 / Python] 계단 오르기

yejichoi·2023년 10월 27일
0

알고리즘 스터디

목록 보기
140/153

계단 오르기

계단 오르는 데는 다음과 같은 규칙이 있다.
계단은 한 번에 한 계단씩 또는 두 계단씩 오를 수 있다. 즉, 한 계단을 밟으면서 이어서 다음 계단이나, 다음 다음 계단으로 오를 수 있다.
연속된 세 개의 계단을 모두 밟아서는 안 된다. 단, 시작점은 계단에 포함되지 않는다.
마지막 도착 계단은 반드시 밟아야 한다.
따라서 첫 번째 계단을 밟고 이어 두 번째 계단이나, 세 번째 계단으로 오를 수 있다. 하지만, 첫 번째 계단을 밟고 이어 네 번째 계단으로 올라가거나, 첫 번째, 두 번째, 세 번째 계단을 연속해서 모두 밟을 수는 없다.
각 계단에 쓰여 있는 점수가 주어질 때 이 게임에서 얻을 수 있는 총 점수의 최댓값을 구하는 프로그램을 작성하시오.


나의 풀이

점화식 미완성

import sys

input = sys.stdin.readline

n = int(input())

arr = [int(input()) for _ in range(n)]
print(arr)
dp = [0] * (n+1)
arr[::-1]
print(dp)
print(arr[::-1])
for i in range(2,n): # 2,3,4,5
    dp[i] += max(arr[i-1], arr[i-2]) + arr[i]

리팩토링

  • arr의 인덱스 맞춰주기 위해 [0] 추가
  • 연속된 3계단을 오를 수 없으므로 dp[1], dp[2] 고정
import sys

n = int(sys.stdin.readline())
arr = [0] + [int(sys.stdin.readline()) for i in range(1, n + 1)]
#print(n, arr)
if n < 2: 
	print(arr[n])
else:
	dp = [0] * (n + 1)
	dp[1] =arr[1]
	dp[2] = dp[1] +arr[2]
	for i in range(3, n + 1):
		dp[i] = max(dp[i - 2], dp[i - 3] +(arr[i - 1])) +arr[i]
    
	print(dp[n])

0개의 댓글