코테 공부/백준

[Python/DP] 9095 1,2,3 더하기

prefer_all 2022. 8. 8. 22:42
문제

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

입력 예시 출력 예시
3
4
7
10
7
44
274

풀이

1. DP 문제임을 확인

-  어떤 항을 구하기 위한 전 항들을 완벽히 구할 수 있고, 그 항들을 이용하여 정의에 맞는 현재 항이 깔끔하게 정의가 됨

 

2. 패턴 찾기

인덱스 n에 대해서 n을 1,2,3의 합으로 나타낼 수 있는 방법의 수를 f(n)이라고 할 때

f(n) = f(n-1) + f(n-2) + f(n-3)

 

 

방법 1) 피보나치 이용

num = int(input())

def f(n):
    if n == 1:
        return (1)
    elif n == 2:
        return (2)
    elif n == 3:
        return (4)
    else:
        return f(n-1)+f(n-2)+f(n-3)
    
for i in range(num):
    n = int(input())
    print(f(n))

 

방법 2) 입력받은 n에 대하여 매번 list를 만들기

num = int(input())

for i in range(num):
    n = int(input())
    n_list = [0]*(n+1)
    if n == 1 :
        print(1)
    elif n == 2 :
        print(2)
    elif n == 3 :
        print(4)
    else:
        n_list[1] = 1
        n_list[2] = 2
        n_list[3] = 4
        for j in range(4, n+1):
            n_list[j] = n_list[j-1] + n_list[j-2] + n_list[j-3]
        print(n_list[n])