본문 바로가기

알고리즘/python

[python/파이썬] 백준 9095 1, 2, 3 더하기

반응형

문제

정수 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])
반응형