[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)