알고리즘/백준

[백준]9095 1, 2, 3 더하기(Python)

cha_eyoon 2024. 1. 5. 11:22

https://www.acmicpc.net/problem/9095

 

9095번: 1, 2, 3 더하기

각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 출력한다.

www.acmicpc.net

 

문제 접근

 

이제는 보자마자 그냥 바로 중복 순열이 떠올랐다. 

 

코드
from itertools import product
T = int(input())

for _ in range(T):
    N = int(input())
    cnt = 0
    for i in range(1, N+1):
        k = list(product([1,2,3],repeat=i))
        for j in k:
            p = sum(list(j))
            if p == N:
                cnt += 1
    print(cnt)

 

++ dp 코드

import sys
input = sys.stdin.readline

T = int(input())

for _ in range(T):
    N = int(input())
    dp = [0] * (N+1)

    for i in range(1, N+1):
        if i == 1:
            dp[i] = 1
        elif i == 2:
            dp[i] = 2
        elif i == 3:
            dp[i] = 4
        else:
            dp[i] = dp[i-1] + dp[i-2] + dp[i-3]

    print(dp[N])

 

회고

 

중복 순열을 사용하면 repeat 사용한다는 점 

 

++ 추가

dp로 풀기 가능

패턴 찾기

dp[1] = 1

dp[2] = 2

dp[3] = 4 :      1+1+1,     1+2,      2+1,      3

dp[4] = 7 :      1+1+1+1,     1+1+2,     1+2+1,     2+1+1,     2+2,     1+3,     3+1

dp[5] = 13 :   1+1+1+1+1,     2+1+1+1(4개),     1+2+2(3개),     1+1+3(3개),     3+2(2개)

...

i >= 4일 때, dp[i] = dp[i-1] + dp[i-2] + dp[i-3]