2579-s3 성공

This commit is contained in:
sm4640
2026-03-26 21:43:22 +09:00
parent e84f83b0b7
commit f28354b79c

View File

@@ -0,0 +1,40 @@
# 계단 오르기
import sys
input = sys.stdin.readline
def solution():
n = int(input().rstrip())
score = [0] * (n+1)
for i in range(1, n+1):
score[i] = int(input().rstrip())
dp = [0] * (n+1)
dp[1] = score[1]
if n >= 2:
dp[2] = score[1] + score[2]
for i in range(3, n+1):
dp[i] = max(dp[i-3]+score[i-1]+score[i], dp[i-2]+score[i])
print(dp[n])
return
solution()
"""
걸린 시간: 20분
시간 복잡도: 각 계단을 한번씩 확인하며 dp를 채우기 때문에 O(n)이다.
해설: 현재 보는 계단을 오려면 어떻게 올 수 있는지 생각했을 때 방향이 한쪽으로 정해져있다. 무조건 올라오는 것이기 때문에 dp를 쓰면 된다.
현재 칸으로 올 수 있는 경우의 수는 2칸 전에서 올라오는 것과 1칸 전에서 올라오되, 그 전에 1칸 점프가 아니어야 한다.(3칸연속 방지)
따라서 2번째 경우의 수는 2번째 전 상황까지 강제를 해줘야 한다. 따라서 dp[i-3]+score[i-1]+score[i]가 되는 것이다.
또한 i-3을 접근하려면 i가 최소 3부터여야 하기 때문에 dp[1], dp[2]까지는 수동으로 설정해줘야 한다.
마지막으로 n은 자연수이므로 1일수도 있다. 이때는 dp[2] 설정이 안되므로 조건문을 달아준다.
"""