새소식

Computer Science/코딩테스트 문제 풀이

[백준] [파이썬] [DP] 9095번: 1, 2, 3 더하기

  • -

문제집 추천, 이 문제집에 나온 유형들만 공부해도 코딩테스트는 거뜬: https://www.acmicpc.net/workbook/by/BaaaaaaaaaaarkingDog

 

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

예제 입력 1

3
4
7
10

예제 출력 1

7
44
274

 


 

가장 대표적인 DP 문제이다. 이 문제를 기반으로 다른 DP를 풀면 되겠다. 따라서 그냥 외워라.

 


 

Buttom-Up 방식 정답

 

import sys 
sys.stdin=open('input.txt','r')



if __name__=="__main__":
    T=int(input())
    dp=[0]*11
    dp[1]=1
    dp[2]=2
    dp[3]=4                     # 처음에 이걸 T for문 안에 넣어서 런타임 에러가 발생했다.
    for _ in range(T):
        n=int(input())
        for i in range(4,n+1):
            dp[i]=dp[i-1]+dp[i-2]+dp[i-3]

        print(dp[n])

 


 

Top-Down : 재귀, 메모이제이션 방식 정답

 

import sys 

def DFS(L):
    if dp[L]>0:             # 시간 단축하기 위한 컷, 이미 값이 들어 있으니 바로 출력
        return dp[L]        # 메모이제이션, 
    if L==1 or L==2:
        return L
    elif L==3:
        return 4
    else:
        dp[L]=DFS(L-1)+DFS(L-2)+DFS(L-3)
        return dp[L]

if __name__=="__main__":
    T=int(input())
    dp=[0]*11
    dp[1]=1
    dp[2]=2
    dp[3]=4
    for _ in range(T):
        n=int(input())

        print(DFS(n))

 


 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.