[Silver I] 1, 2, 3 더하기 5 - 15990
성능 요약
메모리: 126600 KB, 시간: 196 ms
분류
다이나믹 프로그래밍
제출 일자
2026년 04월 25일 22:04:59
문제 설명
정수 4를 1, 2, 3의 합으로 나타내는 방법은 총 3가지가 있다. 합을 나타낼 때는 수를 1개 이상 사용해야 한다. 단, 같은 수를 두 번 이상 연속해서 사용하면 안 된다.
- 1+2+1
- 1+3
- 3+1
정수 n이 주어졌을 때, n을 1, 2, 3의 합으로 나타내는 방법의 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 정수 n이 주어진다. n은 양수이며 100,000보다 작거나 같다.
출력
각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 1,000,000,009로 나눈 나머지를 출력한다.
💡 해결 방법
💻 코드
# https://www.acmicpc.net/problem/15990
t = int(input())
ans = [
[0, 0, 0],
[1, 0, 0],
[0, 1, 0],
[1, 1, 1],
[2, 0, 1]
]
# ]#ans[a][b] = 숫자 a에 대해서 마지막에 b + 1숫자가 오는 경우의 수
#ans[a][0] = a[a - 1][1] + a[a - 1][2]
# ans[a][1] = a[a - 2][0] + a[a-2][2]
# a[a][2] = a[a - 3][0] + a[a - 3][1]
for _ in range(t):
n = int(input())
while len(ans) - 1 <= n:
ei = len(ans) - 1
ans.append([0, 0, 0])
ans[ei][0] = (ans[ei - 1][1] + ans[ei - 1][2]) % 1000000009
ans[ei][1] = (ans[ei - 2][0] + ans[ei-2][2]) % 1000000009
ans[ei][2] = (ans[ei - 3][0] + ans[ei - 3][1] )% 1000000009
print(sum(ans[n]) % 1000000009)