문제
정수 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
[문제 풀이]
1, 2, 3을 이용하여 n을 나타내는 가짓수를 세는 문제이다.
처음에는 중복되는 경우를 제외해야 하는 줄 알고 열심히 생각하고 있었는데, 내가 생각한 것보다 가짓수가
훨씬 많아서 다시 보니 같은 수 다른 순서인 경우도 하나의 방법으로 카운팅이 되는 것이었다.
즉 정수 4의 경우
(1 > 4개) : 1가지
1+1+1+1
(1 > 2개, 2 > 1개) : 3가지
1+1+2
1+2+1
2+1+1
(1 > 1개, 3 > 1개) : 2가지
1+3
3+1
1+3+2 = 7 가지의 경우가 존재한다.
초깃값인 1,2,3도 살펴보면
1은 1가지
1
2는 2가지
1+1
2
3은 4가지
1+1+1
1+2
2+1
3
n번째 숫자의 dp값을 구하기 위해서는 n-1, n-2, n-3번째 숫자의 dp값이 필요하다.
n=4일 때를 구하는 과정을 보면
n-1인 n=3일 때의 경우들에 1씩만 더해주면 4가 되므로
4가지
( 1+1+1 ) + 1
( 1+2 ) + 1
( 2+1 ) + 1
( 3 ) + 1
n-2인 n=2인 경우들에 2씩 더해주면 4가 되므로
2가지
( 1+1 ) + 2
( 2 ) + 2
n-3인 n=1인 경우들에 3씩 더해주면 4가 되므로
1가지
( 1 ) + 3
즉 dp[4] = dp[3] + dp[2] + dp[1] 이 된다.
따라서 dp[n] = dp[n-1] + dp[n-2] + dp[n-3] 이다.
[소스 코드]
T = int(input()) #테스트 케이스 개수
N = [] #n을 저장할 list
for i in range(T):
N.append(int(input()))
dp = [0,1,2,4] #1,2,3에 대한 값 : 초깃값
for i in range(4, max(N)+1): #4부터 N에 저장된 최댓값까지
dp.append(dp[i-1]+dp[i-2]+dp[i-3])
for n in N:
print(dp[n])
'알고리즘 > python' 카테고리의 다른 글
[python/파이썬] 백준 2579 계단 오르기 (0) | 2022.04.07 |
---|---|
[python/파이썬] 백준 11726 2xn 타일링 (0) | 2022.04.06 |
[python/파이썬] 백준 1463 1로 만들기 (0) | 2022.04.04 |
[python/파이썬] 백준 17626 Four Squares (0) | 2022.04.01 |
[python/파이썬] 백준 1010 다리놓기 (0) | 2022.03.30 |