코딩 테스트/백준

[Python] 백준 15989 1,2,3 더하기 4

위시리 2025. 2. 13. 17:38

 

문제 분석

  • 정수 4를 1,2,3의 합으로 나타내는 방법은 총 4가지가 있다. 
  • 합을 나타낼 때에는 수를 1개 이상 사용해야 한다.
  • 정수 n이 주어졌을 때, n을 1, 2, 3의 합으로 나타내는 방법의 수를 구하는 프로그램을 작성하라

 

코드 설계

  • 순서x, 중복o → 순서가 중요하지 않으니 중복 순열로 뽑 : product
  • 중복 조합
  • 최대 횟수는 1로만 이루어진 합일 때

 

정답 코드

1차 - 시간 초과

import sys
from itertools import combinations_with_replacement as cr

input = sys.stdin.readline
tc = int(input())

for _ in range(tc) :
    cnt = 0
    n = int(input())
    iter = [1,2,3]

    for i in range(1, n) :
        for num in cr(iter, i) :
            if sum(num) == n :
                cnt += 1
    print(cnt+1)

 

다른 정답 코드 1 : https://soy3on.tistory.com/313

합을 이루고 있는 수의 순서만 다른 것은 같은 것으로 친다. → 점화식만 잘 세우면 

  • 1 - 1
  • 2 - 1+1; 2
  • 3 - 1+1+1; 2+1; 3 
  • 4 - 1+1+1+1; 2+2; 2+1+1; 3+1  
  • 5 - 1+1+1+1+1; 1+1+1+2; 2+2+1; 2+3; 1+1+3 
  • 6 - 1+1+1+1+1+1; 1+1+2+2; 1+1+1+1+2; 1+2+3; 1+1+1+3; 2+2+2; 3+3
  • 7 - 1+1+1+1+1+1+1; 1+1+1+1+1+2; 1+1+1+2+2; 1+2+2+2; 1+1+2+3; 1+1+1+1+3; 1+3+3; 2+2+3
import sys
input = sys.stdin.readline

t = int(input())

dp = [1] * 10001

for i in range(2, 10001):
    dp[i] += dp[i - 2]

for i in range(3, 10001):
    dp[i] += dp[i - 3]

for _ in range(t):
    print(dp[int(input())])

 

다른 정답 코드 2 : https://ku-hug.tistory.com/209

dp = [1] * 10001

for i in range(2, 10001):
    dp[i] += dp[i - 2]
    
for i in range(3, 10001):
    dp[i] += dp[i - 3]
    
t = int(input())

for _ in range(t):
    n = int(input())
    print(dp[n])