정수 4를 1, 2, 3의 합으로 나타내는 방법은 총 7가지가 있다. 합을 나타낼 때는 수를 1개 이상 사용해야 한다.
1+1+1+1
1+1+2
1+2+1
2+1+1
2+2
1+3
3+1
정수 n이 주어졌을 때, n을 1, 2, 3의 합으로 나타내는 방법의 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 정수 n이 주어진다. n은 양수이며 11보다 작다.
출력
각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 출력한다.

import sys
num = int(sys.stdin.readline())
M = [0 for _ in range(12)]
M[1] = 1; M[2] = 2; M[3] = 4
answer = list()
def find(n):
if M[n] != 0:
return M[n]
M[n] = find(n-1) + find(n-2) + find(n-3)
return M[n]
for i in range(num):
n = int(sys.stdin.readline())
M[n] = find(n)
answer.append(M[n])
for ans in answer:
print(ans)
문제 분류가 동적프로그래밍으로 되어있다.
무언가 규칙을 찾아보자
큰 문제를 작은 문제의 답들 사이의 관계로 풀어내보자
| 정수 n | 방법의 수 |
|---|---|
| 1 | 1 |
| 2 | 2 |
| 3 | 4 |
| 4 | 7 |
| 5 | 13 |
n이 4일때의 값 7은 1(n이 1) + 2(n이 2) + 4(n이 3)
n이 5일때의 값 13은 2(n이 2) + 4(n이 3) + 7(n이 4)
일반화해보면
a를 방법의 수를 구하는 함수라 가정
a(n) = a(n-1) + a(n-2) + a(n-3)
💡피보나치와 비슷하다! -> 정말 많은 중복호출이 발생할 것
📌Memoization 활용