728x90
SMALL
DP로 해결
https://www.acmicpc.net/problem/10826
(1) 처음 내 코드 (런타임 에러 - 실패)
# 피보나치 수4 (실버5)
import sys
n = int(sys.stdin.readline())
dp = (n + 1) * [0]
dp[0] = 0
dp[1] = 1
for i in range(2, n + 1):
dp[i] = (dp[i - 1] + dp[i - 2])
print(dp[n])
문제의 입력을 잘 보면 n은 10000보다 작거나 같은 자연수 또는 0이다. 따라서 n이 0일때 크기가 1인 배열 [0] 하나가 생성되는데, dp[1]에 접근하려 했기 때문에 런타임에러가 난 것이다. 이처럼 문제를 풀 때 입력으로 들어오는 숫자 또한 잘 고려하며 풀어야 한다.
(2) 수정 후 내 코드 (성공)
# 피보나치 수4 (실버5)
import sys
n = int(sys.stdin.readline())
dp = (n + 1) * [0]
dp[0] = 0
if n != 0:
dp[1] = 1
for i in range(2, n + 1):
dp[i] = (dp[i - 1] + dp[i - 2])
print(dp[n])
나는 n이 0일 때 예외처리를 하여 문제를 해결하였다. 하지만 이러한 예외적인 상황을 인지하지 못할 경우를 대비하여 처음부터 이러한 에러가 나는 걸 방지하기 위해선 애초에 dp = [0, 1] 로 dp 배열을 만들어놓고, 이후에 dp[i - 1] + dp[i - 2]한 값을 append하는식으로 짜면 될 것 같다. 문제를 한 번에 맞기 위해선 문제를 풀 때 예외처리 및 문제 접근법도 정말 중요한 것 같다.
728x90
LIST
'Algorithm > DP' 카테고리의 다른 글
[백준] 2294번 : 동전 2 (파이썬) (0) | 2024.02.18 |
---|---|
[백준] 11054번 : 가장 긴 바이토닉 부분 수열 (파이썬) (2) | 2024.01.22 |
[백준] 2565번 : 전깃줄 (파이썬) (0) | 2024.01.20 |
[백준] 9465번 : 스티커 (파이썬) (1) | 2024.01.06 |
[백준] 11053번 : 가장 긴 증가하는 부분 수열 (파이썬) (1) | 2024.01.05 |