48 lines
1.9 KiB
Python
48 lines
1.9 KiB
Python
# 1, 2, 3 더하기 4
|
|
|
|
import sys
|
|
|
|
input = sys.stdin.readline
|
|
|
|
def update_dp(start, n, dp):
|
|
for i in range(start, n+1):
|
|
dp[i] = (sum(dp[i-1]), sum(dp[i-2][1:]), sum(dp[i-3][2:]))
|
|
|
|
return
|
|
|
|
def solution():
|
|
t = int(input().rstrip())
|
|
dp = [-1] * 10001
|
|
dp[1], dp[2], dp[3] = (1, 0, 0), (1, 1, 0), (2, 0, 1)
|
|
start = 4
|
|
for _ in range(t):
|
|
n = int(input().rstrip())
|
|
if dp[n] == -1:
|
|
update_dp(start, n, dp)
|
|
start = n+1
|
|
print(sum(dp[n]))
|
|
|
|
return
|
|
|
|
|
|
solution()
|
|
|
|
"""
|
|
걸린 시간: 1시간
|
|
|
|
시간 복잡도: dp[n]까지 채우는데 한번 채울때 O(1)이므로 테스트케이스 중에 가장 큰 n만큼 시간이 걸린다. O(max(n))
|
|
|
|
해설: 몇 가지 n에 대해 모든 경우의 수를 만들어보니,
|
|
dp[n]을 구할 때 이전 숫자들의 경우에다 1, 2, 3 을 더해서 할 수 있겠다고 생각했다.
|
|
n-1, n-2, n-3에서 1, 2, 3의 숫자를 더해서 만들고, 중복되는 것들을 없애기 위해 규칙을 파악했다.
|
|
1 > 2 > 3 으로 우선순위를 두고, 각각 포함된 것들의 개수를 기록해나간다.
|
|
1 0 0, 1 1 0, 2 0 1, 3 1 0, 4 1 0, 5 1 1 ... 이 다음 것을 찾아보자
|
|
n-1에서 모든 경우에 1을 더해주면 되기 때문에 5+1+1 = 7이 된다.
|
|
n-2에서 모든 경우에 1을 추가한 것이 이미 n-1에 있다. 따라서 1을 안 쓴 2, 3 그룹의 경우에만 2를 더해주면 되기 때문에 1+0=1이 된다.
|
|
n-3도 n-2 원리를 적용하여 3 그룹의 경우에만 3을 더해주면 0=0이 된다.
|
|
따라서 7 1 0 이되고, 숫자 7의 전체 경우의 수는 8개이다.
|
|
근데 이렇게 안하고 더 쉬운 방법이 있다.
|
|
1만 쓴 경우, 2도 쓴 경우, 3도 쓴 경우로 도구를 늘려가면서 dp를 갱신하는 방법이다.
|
|
1만 쓴 경우는 당연히 다 1이다.
|
|
2를 추가하게 되면 dp[i] += dp[i-2]로 현재 숫자-2에서 나온 모든 경우의 수의 끝에 +2를 붙이는 것이다. 3도 마찬가지.
|
|
""" |