1,2,3 더하기(4) (15989)
- 합을 이루고 있는 수의 순서만 다른 것은 같은 것으로 친다.
- 2+1+1 (1+1+2,1+2+1)
- 이럴 때는 수를 그룹 지어서 합이 만들어진다고 생각하면 된다.
- 모든 1이 등장하고, 모든 2가 등장하고, 모든 3이 등장했다. 이것이 유일하다고 생각하면 같은게 없어지게 된다.
- 1로 먼저 모든 합을 만들고, 거기서 2를 추가해서 만들어보고, 거기서 3을 추가해서 만들어보는 것이다.
1,2,3 더하기
n = 4
m = 3
nums = [1, 2, 3]
d = [1]+[0]*10
for i in range(1, n+1):
for j in range(m):
if i - nums[j] >= 0: # d[i] = d[i-1]+d[i-2]+d[i-3]
d[i] += d[i-nums[j]]
print(d)
1,2,3 더하기 4
n = 4
m = 3
nums = [1, 2, 3]
d = [1]+[0]*10
for j in range(m): # 중복을 제거하는 코드
for i in range(n):
if i - nums[j] >= 0:
d[i] += d[i-nums[j]]
print(d)
t = int(input())
nums = [1, 2, 3]
while t:
t -= 1
n = int(input())
m = 3
d = [1]+[0]*n
for j in range(m):
for i in range(1, n+1):
if i - nums[j] >= 0:
d[i] += d[i-nums[j]]
print(d[n])
좋은 답안
limit = 10000
d = [0] * (limit + 1)
d[0] = 1
for i in range(1, limit+1):
if i-1 >= 0:
d[i] += d[i-1]
for i in range(1, limit+1):
if i-2 >= 0:
d[i] += d[i-2]
for i in range(1, limit+1):
if i-3 >= 0:
d[i] += d[i-3]
t = int(input())
for _ in range(t):
n = int(input())
print(d[n])
또 다른 방법
dp = [[0 for _ in range(10001)] for _ in range(2)]
dp[0][2] = 1
for i in range(3, 10001):
dp[0][i] = dp[0][i - 2] + 1
dp[1][i] = dp[0][i - 3] + dp[1][i - 3] + 1
for _ in range(int(input())):
n = int(input())
print(1 + dp[0][n] +dp[1][n])
참고자료 codeplus