본문 바로가기

2024 코딩테스트 스터디

[8주_7일차] 백준-9095 1,2,3 더하기(Python)

문제

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

 

 

 

 

 

<코드>

def solve_cases(cases):
    # DP 배열 초기화
    dp = [0] * 12
    dp[0] = 1
    dp[1] = 1
    dp[2] = 2
    dp[3] = 4
    
    # DP 배열 채우기
    for i in range(4, 12):
        dp[i] = dp[i-1] + dp[i-2] + dp[i-3]
    
    # 결과 저장
    results = []
    for n in cases:
        results.append(dp[n])
    
    return results

import sys
input = sys.stdin.read
data = input().split()
T = int(data[0])
cases = list(map(int, data[1:]))

results = solve_cases(cases)
for result in results:
    print(result)

 

 

<풀이과정>

 

  • DP 배열 정의:
    • dp[i]는 정수 ii를 1, 2, 3의 합으로 나타내는 방법의 수
  • 기저 사례 초기화:
    • dp[0]=1: 0을 만드는 방법은 하나도 없으므로 0.
    • dp[1]=1: 1을 만드는 방법은 1 하나뿐.
    • dp[2]=2: 2를 만드는 방법은 1+1, 2 두 가지.
    • dp[3]=4: 3을 만드는 방법은 1+1+1, 1+2, 2+1, 3 네 가지.
  • 점화식:
    • dp[n]=dp[n−1]+dp[n−2]+dp[n−3]
    • 을 1, 2, 3의 합으로 나타내기 위해 마지막에 더해지는 숫자를 고려
    • 만약 n을 만들 때 마지막에 더한 숫자가 1이라면, 그 이전에 만들어진 수는 n−1
    • 만약 마지막에 더한 숫자가 2라면, 그 이전에 만들어진 수는 n−2
    • 만약 마지막에 더한 숫자가 3이라면, 그 이전에 만들어진 수는 n−3