라떼는말이야

[solved.ac 실버3] 9095_1, 2, 3 더하기 (DP 풀이) 본문

알고리즘/코딩 테스트

[solved.ac 실버3] 9095_1, 2, 3 더하기 (DP 풀이)

MangBaam 2021. 9. 20. 17:33
반응형

제한 사항

문제

정수 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의 합으로 나타내는 방법의 수를 출력한다.

예제

 


나의 풀이

DP로 풀이했다. 패턴을 찾아보자.

  • 0을 만드는 방법: 1, 2, 3을 0개 더한다.
  • 1을 만드는 방법: 1
  • 2를 만드는 방법: 1+1 / 2
  • 3을 만드는 방법: 1+1+1 / 1+2 / 2+1/ 3
  • 4를 만드는 방법: 1+1+1+1 / 1+1+2 / 1+2+1 / 2+1+1 / 2+2 / 1+3 / 3+1
  • ...
  • i를 만드는 방법: i-1를 만드는 방법에 1 더하기 / i-2를 만드는 방법에 2 더하기 / i-3을 만드는 방법에 3 더하기
  • ...

 

위 처럼 찾아보았다.

3부터는 i를 만드는 방법의 패턴이 가능하다.

 

3을 만드는 방법은 2를 만드는 방법에 1 더하기 / 1을 만드는 방법에 2 더하기 / 0을 만드는 방법에 3 더하기 이다.

4를 만드는 방법은 3을 만드는 방법에 1 더하기 / 2를 만드는 방법에 2 더하기 / 1을 만드는 방법에 3 더하기 이다.

...

0을 만드는 방법은 한 가지 이다. (아무 것도 더하지 않는 경우)

1을 만드는 방법도 한 가지 이다. (1을 하나 더하는 경우)

2를 만드는 방법은 두 가지 이다. (1+1 , 2)

 

위 사실을 바탕으로 코드를 짜면 다음과 같다.

t = int(input())
d = [0] * 11
d[0], d[1], d[2] = 1, 1, 2
for i in range(3, 11):
    d[i] = d[i-1] + d[i-2] + d[i-3]
for _ in range(t):
    print(d[int(input())])

 

채점 결과

 

반응형
Comments