알고리즘
[백준 2579] 계단 오르기 - 파이썬
Codult
2024. 1. 26. 16:40
728x90
백준 2579 - 계단 오르기

* 풀이과정
다이나믹 프로그래밍 유형의 문제로, 규칙을 찾아 점화식을 이용한다.
1) 계단의 수 N을 입력받는다.
2) 계단의 점수를 L = [0] * (N+1) 리스트에 저장한다.
3) j 번째 계단 별 최대 점수를 저장할 dp = [0] * (N+1) 리스트를 생성한다.
4) dp 구하기
- dp[1] = L[1]
- dp[2] = L[1] + L[2]
- dp[3] = max(L[1]+L[3], L[2]+L[3])
- 3보다 큰 j번째 계단을 오를 때의 점수 최댓값은 j-1번째 계단을 밟을 때와 밟지 않을 때로 나뉜다. (j번째는 항상 밟아야 함)
(i) j-1 번째 계단을 밟는 경우: dp[j-3] + L[j-1] + L[j]
j-2 번째 계단을 밟을 수 없고, j-3번째 계단을 무조건 밟아야 한다. 따라서, j-3번째 계단을 오를 때까지의 최대 점수에 j-1, j번째 계단의 점수를 더하면 된다.
(ii) j-1 번째 계단을 밟지 않는 경우: dp[j-2] + L[j]
j-2번째 계단을 무조건 밟아야 한다. 따라서, j-2번째 계단을 오를 때까지의 최대 점수에 j번째 계단의 점수를 더하면 된다. - 위 두가지 경우 중 더 큰 값을 max()로 선택하면 된다.
5) N이 3보다 작거나 같은 경우, 인덱스 오류가 발생하므로 if 문으로 제한해야 한다.
N = int(input())
L = [0]*(N+1)
# 계단 별 점수 입력받기
for i in range(1, N+1):
L[i] = int(input())
if N >= 3:
dp = [0] * (N+1)
dp[1] = L[1]
dp[2] = L[1]+L[2]
dp[3] = max(L[1]+L[3], L[2]+L[3])
# 3보다 큰 j번째 계단을 오를 때, 점수의 최댓값은 j-1번째 계단을 밟거나 그렇지 않은 경우로 나뉨
# 두가지 경우 중 max 값을 dp[j]에 저장
# 1) j-1번째 계단을 밟는 경우: j-2번째 계단을 밟지 않고 j-3번째 계단을 밟아야 하므로,
# dp[j-3] + L[j-1] + L[j]
# 2) j-1번째 계단을 밟지 않는 경우: j-2번째 계단을 밟아야 하므로,
# dp[j-2] + L[j]
for j in range(4, N+1):
dp[j] = max(dp[j-3]+L[j-1]+L[j], dp[j-2]+L[j])
print(dp[N])
# Index Error 방지
elif N == 2: print(L[1]+L[2])
else: print(L[1])
728x90