[백준(python)] 9095번: 1, 2, 3 더하기

세하·2023년 11월 2일

[백준] 문제풀이

목록 보기
24/94
post-thumbnail

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

풀이

import sys

num = int(sys.stdin.readline())
M = [0 for _ in range(12)]
M[1] = 1; M[2] = 2; M[3] = 4
answer = list()

def find(n):
    if M[n] != 0:
        return M[n]
    M[n] = find(n-1) + find(n-2) + find(n-3)
    return M[n]

for i in range(num):
    n = int(sys.stdin.readline())
    M[n] = find(n)
    answer.append(M[n])

for ans in answer:
    print(ans)

설명

문제 분류가 동적프로그래밍으로 되어있다.
무언가 규칙을 찾아보자
큰 문제를 작은 문제의 답들 사이의 관계로 풀어내보자

정수 n방법의 수
11
22
34
47
513

n이 4일때의 값 7은 1(n이 1) + 2(n이 2) + 4(n이 3)
n이 5일때의 값 13은 2(n이 2) + 4(n이 3) + 7(n이 4)
일반화해보면
a를 방법의 수를 구하는 함수라 가정
a(n) = a(n-1) + a(n-2) + a(n-3)

💡피보나치와 비슷하다! -> 정말 많은 중복호출이 발생할 것
📌Memoization 활용

0개의 댓글