Programming/백준

[골드 5] 백준 15989 - 1, 2, 3 더하기 4 (파이썬)

pental 2025. 4. 23. 12:12

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

풀이

  • 정수 N을 1, 2, 3의 합으로 나타내는 방법의 수를 구하라
  • 같은 수라도 순서가 다른 것은 같은 경우로 취급한다.
  • 예를 들어 3 = 1 + 2 와 2 + 1은 같은 경우로 처리된다.

DP 배열을 아래와 같이 정의한다.

D = [[0] * 10001 for _ in range(4)]

D[i][j]는 1부터 i까지의 숫자만 사용해서 j를 만드는 경우의 수를 의미한다.

  • 예를 들어서 D[2][4]는 1, 2만 사용해서 4를 만드는 방법의 수를 나타낸다.

점화식은 아래와 같이 구성한다.

D[0][0] = 1
for i in range(1, 4):  # 1, 2, 3 사용
    for j in range(10001):
        D[i][j] = D[i - 1][j]  # i를 사용하지 않는 경우

        if j >= i:
            D[i][j] += D[i][j - i]  # i를 사용하는 경우

D[i][j] = D[i - 1][j] + D[i][j - 1]

  • D[i - 1][j] : 현재 숫자 i를 사용하지 않고 만드는 경우
  • D[i][j - i] : 숫자 i를 적어도 하나 이상 사용하여 만드는 경우
for _ in range(T):
    N = int(input())
    print(D[3][N])
  • D[3][N]은 1, 2, 3을 사용해서 N을 만드는 오름차순 걍우의 수를 나타낸다.

예시로 N = 4 일떄

가능한 경우는 다음과 같다.

  • 1 + 1 + 1 + 1
  • 1 + 1 + 2
  • 1 + 3
  • 2 + 2

총 4가지 → D[3][4] = 4

코드

# 백준 15989 - 1,2,3 더하기 4
# 분류 : 다이나믹 프로그래밍

T = int(input())

D = [[0] *  10001 for _ in range(4)]
D[0][0] = 1
for i in range(1, 4) :
    for j in range(10001) :
        D[i][j] = D[i - 1][j]

        if j >= i :
            D[i][j] += D[i][j - i]
        
for _ in range(T) :
    N = int(input())

    print(D[3][N])