문제 설명
문제
정수 4를 1, 2, 3의 합으로 나타내는 방법은 총 7가지가 있다. 합을 나타낼 때는 수를 1개 이상 사용해야 한다.
- 1+1+1+1
- 1+1+2
- 1+2+1
- 2+1+1
- 2+2
- 1+3
- 3+1
정수 n이 주어졌을 때, n을 1, 2, 3의 합으로 나타내는 방법의 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 정수 n이 주어진다. n은 양수이며 1,000,000보다 작거나 같다.
출력
각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 1,000,000,009로 나눈 나머지를 출력한다.
풀이 과정
- n에 도달하기 위해서는 n-1에서 1 더하거나, n-2에서 2 더하거나, n-3에서 3 더하는 방법밖에 없음.
- 따라서 dp를 dp[n] = dp[n-1] + dp[n-2] + dp[n-3]으로 해주면 된다.
- 이 때, 그냥 해주면 수가 너무 커지게 되서 시간 초과가 나옴.
- 매 순간 더해주는 값과 결과에 % 100000009를 해주어야 함.
소스 코드
import sys
input = sys.stdin.readline
n = int(input().rstrip())
dp = [0] * 1000001
a = 1
b = 2
c = 4
d = 0
for j in range(4, 1000001):
d = (a + b + c) % 1000000009
a = b % 1000000009
b = c % 1000000009
c = d % 1000000009
dp[j] = d
for i in range(n):
tc = int(input().rstrip())
if tc == 1:
print(1)
elif tc == 2:
print(2)
elif tc == 3:
print(4)
else:
print(dp[tc])
'알고리즘[Python] > 백준 알고리즘' 카테고리의 다른 글
[ 14916 ] [DP] 거스름돈 (0) | 2021.07.29 |
---|---|
[ 11779 ] [ 최단 경로 ] 최소비용 구하기 2 (0) | 2021.07.28 |
[ 11659 ] [DP] 2×n 타일링 2 (0) | 2021.07.27 |
[11659] [DP] 구간 합 구하기 (0) | 2021.07.27 |
[ 9625] [DP] BABBA (0) | 2021.07.27 |