문제
정수 4를 1, 2, 3의 합으로 나타내는 방법은 총 7가지가 있다. 합을 나타낼 때는 수를 1개 이상 사용해야 한다.
정수 n이 주어졌을 때, n을 1, 2, 3의 합으로 나타내는 방법의 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 정수 n이 주어진다. n은 양수이며 1,000,000보다 작거나 같다.
3
4
7
10
출력
각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 1,000,000,009로 나눈 나머지를 출력한다.
7
44
274
접근 방식
dp 값은 1,2,3의 합으로 나타낼 수 있는 경우의 수
1,2,3의 합으로 4를 나타낼 경우의 수는
4 - 3 의 경우의 수에서 오른쪽에 1을 더하면 되므로 결국 4 - 3 의 경우의 수를 더하고
4 - 2 의 경우의 수에서 오른쪽에 2를 더하면 되므로 결국 4 - 2 의 경우의 수를 더하고
4 - 1 의 경우의 수에서 오른쪽에 3을 더하면 되므로 결국 4 - 1 의 경우의 수를 더하면
정답을 구할 수 있다.
dp를 최대 크기만큼 0으로 초기화한다
1부터 3까지 1, 2, 3의 합으로 나타낼 수 있는 경우의 수 초기값을 넣는다
dp[4] 부터는 num - 3 의 모든 경우의 수와 num - 2 의 모든 경우의 수, num - 1 의 모든 경우의 수를 더하면 된다
테스트 케이스를 입력받고 바로 dp 값을 출력한다
코드
import sys
t = int(input())
dp = [0] * (1000001)
dp[1] = 1
dp[2] = 2
dp[3] = 4
# 미리 dp 전체를 계산
for i in range(4, 1000001):
dp[i] = (dp[i-3] + dp[i-2] + dp[i-1]) % 1000000009
for _ in range(t):
num = int(sys.stdin.readline())
print(dp[num])