diff --git a/workbook_8708/gold/15989-g5.py b/workbook_8708/gold/15989-g5.py new file mode 100644 index 0000000..83bb791 --- /dev/null +++ b/workbook_8708/gold/15989-g5.py @@ -0,0 +1,48 @@ +# 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도 마찬가지. +""" \ No newline at end of file