어김없이 다이나믹 프로그래밍.
import sys
n = int(sys.stdin.readline())
dp = [0] * (n+1)
dp[1] = 1
dp[2] = 2
for i in range(3, n+1):
dp[i] = dp[i-1] + dp[i-2]
print(dp[n]%10007)
이 풀이를 내고 런타임 에러가 났다. Index 문제여서 최솟값, 최댓값을 한 번 비교해보았다. 1을 넣으니,
이와 같은 에러가 나타나는 것을 확인했다.
n=1일 때, len(dp) = 2 이므로 dp[2]
가 없는 것이다. 그래서 n+2를 해줬다.
import sys
n = int(sys.stdin.readline())
dp = [0] * (n+2)
dp[1] = 1
dp[2] = 2
for i in range(3, n+1):
dp[i] = dp[i-1] + dp[i-2]
print(dp[n]%10007)
풀이에 대해서 소개하자면, 2*n에서 n에 따른 규칙을 발견했다.
- n=1일 때, 방법의 개수: 1
- n=2일 때, 방법의 개수: 2
- n=3일 때, 방법의 개수: 3
- n=4일 때, 방법의 개수: 5
- n=5일 때, 방법의 개수: 8
- n=6일 때, 방법의 개수: 13
이런 식으로 1과 2일 때를 제외하고는 모두 앞의 두 항의 값을 더한 값인 것이다. 마치 피보나치 수열 풀이와 굉장히 유사하다.
DP에 대해서 깨닫고 나니 문제 풀이가 훨씬 쉬워졌다! 오늘도 신기한 알고리즘의 세계 끝이다 ~!