2579번: 계단 오르기

임성빈·2022년 1월 20일
0

백준 문제풀이

목록 보기
8/10
post-thumbnail

import sys
input = sys.stdin.readline

n = int(input())
li = [int(input()) for _ in range(n)]
dp = []

if n == 1:
  print(li[0])

elif n == 2:
  print(li[0]+li[1])

elif n == 3:
  print(max(li[0]+li[2],li[1]+li[2]))

else:
  dp.append(li[0])
  dp.append(li[0]+li[1])
  dp.append(max(li[0]+li[2], li[1]+li[2]))
  for i in range(3,n):
    dp.append(max(li[i] + li[i-1] + dp[i-3], li[i] + dp[i-2]))
  print(dp[-1])

점수를 받아둘 리스트 li 와 최소 점수를 저장할 리스트 dp 를 만든다.

if 문을 이용해 n 이
1일 경우 li[0]을 그대로 출력,
2일 경우 li[0] + li[1] or sum(li) 를 출력,
3일 경우 max( li[0] + li[2], li[1] + li[2] )를 출력한다.

n 이 1, 2, 3 이외의 숫자일 경우
앞의 1, 2, 3일 경우의 최소 점수를 dp 리스트에 저장 시킨 후,
dp 의 index 0, 1, 2가 채워졌으니 3부터 n-1 까지 채워준다.

이 때 최솟값은 채우는 방법은 계단을 오를 때 항상 마지막은 밟고 있어야 한다.
li[i-3]까지 의 최대값 dp[i-3]과 li[i-2]를 건너뛰고 li[i-1]을 거치고 li[ i ]를 밟는 방법
li[i-2]까지의 최대값 dp[i-2]와 li[i-1]을 건너뛰고 li[i]를 밟는 방법 중 max 값을 저장한다.

출력은 dp[-1]로 마지막 입력값을 출력해준다.

profile
iOS 앱개발

0개의 댓글

관련 채용 정보