백준 2579: 계단오르기 해설- python
프로그래밍/백준

백준 2579: 계단오르기 해설- python

728x90
반응형

✏️ 문제

 

2579번: 계단 오르기

계단 오르기 게임은 계단 아래 시작점부터 계단 꼭대기에 위치한 도착점까지 가는 게임이다. <그림 1>과 같이 각각의 계단에는 일정한 점수가 쓰여 있는데 계단을 밟으면 그 계단에 쓰여 있는 점

www.acmicpc.net

2579

 

✏️ 풀이

 

계단오르기

케이스는 두가지로 분리된다. 이전에 두 계단을 연속으로 오른 경우. 그리고 3계단 이전에는 두계단을 오르고 바로 이전에서 현지점까지 연속으로 올라오는 경우.

본 문제에서는 리스트를 두개 만들었다. i번째 계단까지 최대값을 저장하는 dp[] & 문제에서 준 계단점수를 저장하는 arr[]

이를 점화식으로 나타내보면 아래와 같을 것이다.

 

1. dp[i-2] + arr[i]

2. dp[i-3] + arr[i-1] + arr[i]

 

n=int(input())
arr=[] # 계단 점수
dp=[]

for _ in range(n):
  arr.append(int(input()))

#아래 수식에 i-3들어가니까 index범위 맞추기위해 3까지 하드코딩 
dp.append(arr[0])
dp.append(max(arr[0]+arr[1], arr[1]))
dp.append(max(arr[0]+arr[2], arr[1]+arr[2]))

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

print(dp.pop())

해당 풀이는 IndexError가 발생한다. 이전에 https://duckracoon.tistory.com/entry/%EB%B0%B1%EC%A4%80-2748%EB%B2%88-%EB%9F%B0%ED%83%80%EC%9E%84%EC%97%90%EB%9F%ACIndexError

 

백준 2748번 런타임에러(IndexError)

2748번: 피보나치 수 2 피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다. 이를 식으로 써보면 Fn =

duckracoon.tistory.com

와 같은 이유에서이다. 계단이 1개인 경우에 arr[2]가 존재하겠는가? 

 

코드 반복되는거 불펴하긴한데 우선 그냥 케이스분리로 해결해두긴했다.

# dp배열: i번째 계단까지 최대값을 저장
# arr배열: 문제에서 주어진 계단점수 저장
# 케이스분리
# 이전에 두계단을 연속으로 오른 경우
# 3계단 이전에서는 2계단을 오륵 바로 이전에서 현재까지 연속

n=int(input())
arr=[] # 계단 점수
dp=[]

for _ in range(n):
  arr.append(int(input()))

if n==1:
  dp.append(arr[0])
  print(dp.pop())
elif n==2:
  dp.append(arr[0])
  dp.append(max(arr[0]+arr[1], arr[1]))
  print(dp.pop())
elif n==3:
  dp.append(arr[0])
  dp.append(max(arr[0]+arr[1], arr[1]))
  dp.append(max(arr[0]+arr[2], arr[1]+arr[2]))
  print(dp.pop())

else:
  #아래 수식에 i-3들어가니까 index범위 맞추기위해 3까지 하드코딩 
  dp.append(arr[0])
  dp.append(max(arr[0]+arr[1], arr[1]))
  dp.append(max(arr[0]+arr[2], arr[1]+arr[2]))

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

  print(dp.pop())

 

728x90
반응형