2579번:계단 오르기(IndexError 해결)

IndexError 이유

input n 이 0일 때 dp[1] = stairs[1] 에서 stairs[1]에 접근하기 때문
또한 n 이 1, 2, 3 일때도 dp 초기화에서 같은 문제가 발생한다.
input n이 0 이면 stairs에는 -1만 들어있는 상태이기 때문에, 리스트가 stairs[0]까지만 접근이 가능하다.
그런데 있지도 않은 stairs[1]에 접근하려고 하니 IndexError가 떴던 것

IndexError가 난 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import collections

n = int(input())
stairs = [-1]
for _ in range(n):
stairs.append(int(input()))

dp = collections.defaultdict(int)
dp[1] = stairs[1]
dp[2] = stairs[1]+stairs[2]
dp[3] = max(stairs[1] + stairs[3], stairs[2]+stairs[3])

for i in range(4, n+1):
dp[i] = max(dp[i-2]+stairs[i], dp[i-3]+stairs[i-1]+stairs[i])

print(dp[n])

IndexError 해결방법1

staris 도 defaultdict(int)로 선언해준다.

  • 메모리 32692KB
  • 시간 112ms
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import collections

n = int(input())
stairs = collections.defaultdict(int)
for i in range(1, n+1):
stairs[i] = int(input())

dp = collections.defaultdict(int)
dp[1] = stairs[1]
dp[2] = stairs[1]+stairs[2]
dp[3] = max(stairs[1] + stairs[3], stairs[2]+stairs[3])

for i in range(4, n+1):
dp[i] = max(dp[i-2]+stairs[i], dp[i-3]+stairs[i-1]+stairs[i])

print(dp[n])

IndexError 해결 방법2

if문으로 n이 0일 때와 dp 초기화에 해당하는 n이 1,2,3 일 때를 모두 if문으로 예외처리해준다.

  • 메모리 32716KB
  • 시간 108ms
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import collections

n = int(input())
stairs = [-1]
for _ in range(n):
stairs.append(int(input()))

dp = collections.defaultdict(int)
if n == 0:
print(0)
elif n == 1:
print(stairs[1])
elif n == 2:
print(stairs[1]+stairs[2])
elif n == 3:
print(max(stairs[1] + stairs[3], stairs[2]+stairs[3]))
else:
dp[1] = stairs[1]
dp[2] = stairs[1]+stairs[2]
dp[3] = max(stairs[1] + stairs[3], stairs[2]+stairs[3])

for i in range(4, n+1):
dp[i] = max(dp[i-2]+stairs[i], dp[i-3]+stairs[i-1]+stairs[i])

print(dp[n])