알고리즘 문제풀이/Dynamic programming

백준 2579 파이썬(DP)

Aytekin 2021. 10. 13. 10:58

 

https://www.acmicpc.net/problem/2579

 

2579번: 계단 오르기

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

www.acmicpc.net

문제의 조건은 세가지다.

1. 연속된 세개의 계단을 밟으면 안됨

2. 마지막 계단은 밟아야함

3. 한칸 또는 두칸씩 이동 가능함.

 

마지막 계단은 밟아야하므로

i번째 계단이라고 한다면

 

max(i-2번째 계단을 밟고 두칸을 뛰어 i번째로 온 경우, i-3번째 계단을 밟고 i-1번째를 밟고 i번째로 온 경우)

이런식으로 점화식을 만들면 된다.

 

  • 코드
# 2579 - 계단 오르기

n = int(input())
steps = []
for _ in range(n):
    steps.append(int(input()))

res = [0] * (n)

res[0] = steps[0]
res[1] = steps[0] + steps[1]
res[2] = max(steps[0] + steps[2],steps[1] + steps[2])
for i in range(3,n):
    print(f'res:{res}')
    res[i] = max(res[i-2]+steps[i], res[i-3]+steps[i-1]+steps[i])
print(f'steps:{steps} res:{res}')
print(res[n-1])

 

맨 처음에 내가 짯던 코드다

이상하게 계속 IndexError가 났다.

입력이 되는 만큼 리스트를 초기화 할 수 있도록 코드를 짯는데

무슨 이유인지는 모르겠는데 인덱스 에러가 난다.

 

그래서 구글링해서 다른 사람들의 코드를 찾아보니

처음부터 넉넉한 크기로 리스트를 초기화한다음에 거기에 숫자들을 대입하는 방식으로 했다.

이러니 통과가 되었다...;;

 

누구한테 이 문제를 물어볼 수 있을까...ㅠㅠ

n = int(input())

res = [0 for _ in range(301)]

steps = [0 for _ in range(301)]
for i in range(n):
    steps[i] = int(input())

res[1] = steps[0]
res[2] = steps[0] + steps[1]
res[3] = max(steps[0] + steps[2],steps[1] + steps[2])
for i in range(4,n+1):
    res[i] = max(res[i-2]+steps[i-1], res[i-3]+steps[i-1]+steps[i-2])

print(res[n])
728x90

'알고리즘 문제풀이 > Dynamic programming' 카테고리의 다른 글

백준 9095 파이썬(DP)  (0) 2022.02.02
백준 1463 파이썬(DP)  (0) 2021.10.13
백준 1932 파이썬(DP)  (0) 2021.10.12
백준 1149 파이썬(DP)  (0) 2021.10.11
백준 9416 파이썬(DP)  (0) 2021.10.10