문제
정수 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의 합으로 나타내는 방법의 수를 출력한다.
예제 입력 1
3
4
7
10
예제 출력 1
7
44
274
나의 코드
[Python(파이썬)]
n = int(input())
nlist = [int(input()) for _ in range(n)]
result = [0, 1, 2, 4]
nmax = max(nlist)
if nmax > 3:
for i in range(4, nmax + 1):
result.append(sum(result[i - 3:i]))
for j in nlist:
print(result[j])
풀이
1부터 차례대로 1, 2, 3을 이용해 만들 수 있는 경우의 수를 나열해보았다.
4가 나올 수 있는 경우의 수를 작성하다보니 약간의 규칙이 보이고 5가 나올 수 있는 경우의 수를 작성하고는 그 규칙이 맞을 수 있겠다는 생각을 했다.
확실히 하기 위해 위에서 생각한 규칙을 사용해 예제에서 나온 값까지 계산해보니 답이 되는 것을 확인했다.
바로 그 규칙은 앞의 3개 숫자의 경우의 수 합이 해당 숫자의 경우의 수인 것이다.
dp[n] = dp[n-1] + dp[n-2] +dp[n-3]
이 문제는 테스트 케이스 1개의 답을 구하는 것이 아니라 입력으로 주어진 테스트 케이스의 개수의 답을 모두 출력하는 것이기에 반복해서 계산하지 않기 위해 주어진 테스트 케이스 중 가장 큰 값을 nmax에 저장해두고 그 값까지의 dp를 모두 저장한 다음 출력했다.
result = [0, 1, 2, 4]
nmax = max(nlist)
if nmax > 3:
for i in range(4, nmax + 1):
result.append(sum(result[i - 3:i]))
1~3까지는 위의 규칙대로 이루어지지 않기 때문에 result에 값을 미리 저장해두고 규칙은 4 이상일 때만 적용한다.
문제 출처
9095번: 1, 2, 3 더하기
각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 출력한다.
www.acmicpc.net
'[Python] Baekjoon > Dynamic Programming(동적계획법)' 카테고리의 다른 글
[백준(Baekjoon)]12865 평범한 배낭 (0) | 2021.12.31 |
---|---|
[백준(Baekjoon)] 9251 LCS (0) | 2021.12.25 |
[백준(Baekjoon)] 11726 2*n 타일링 (0) | 2021.12.23 |
[백준(Baekjoon)] 2579 계단 오르기 (0) | 2021.12.19 |
[백준(Baekjoon)] 2747 피보나치 수 (0) | 2021.12.19 |
댓글