great_park
great_park
great_park
전체 방문자
오늘
어제
06-27 13:13
  • 분류 전체보기 (124)
    • Computer Science (48)
      • Database (9)
      • Operating System (8)
      • Computer Network (0)
      • Computer Architecture (9)
      • Cloud computing (9)
      • Algorithm (13)
    • Algorithm PS (62)
      • DFS & BFS (21)
      • Floyd-Warshall (1)
      • Dijkstra (0)
      • Divide and Conquer (0)
      • Dynamic Programing (22)
      • Greedy (0)
      • BackTracking (11)
      • Binary Search (6)
      • Brute Force (0)
      • Sorting (0)
      • Stack & Queue (1)
      • Number Theory (0)
    • 기타 (12)
      • AWS (3)
      • Docker (1)
      • 기타 (8)
    • 2023 Google Solution Challenge (1)

최근 글

인기 글

블로그 메뉴

  • 홈
  • 태그
  • 방명록
반응형

태그

  • cloud computing
  • Docker
  • operating system
  • dfs
  • LIS
  • Computer Architecture
  • Binary Search
  • pub/sub
  • Node.js
  • BOJ
  • backtracking
  • mysql
  • DeadLock
  • Binarysearch
  • BFS
  • 알고리즘
  • php
  • Single-Cycle Datapath
  • dp
  • Database
hELLO · Designed By 정상우.
great_park

great_park

Algorithm PS/Dynamic Programing

[BOJ/백준] 9095번 1,2,3 더하기 (Python 파이썬)

2023. 2. 6. 17:44
반응형

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

 

9095번: 1, 2, 3 더하기

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

www.acmicpc.net

 

문제

정수 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[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, 1+2 * 5개, 2+2+1 * 3개, 3+1+1 *3게, 3+2
dp[6] = 24 : 1+1+1+1+1+1, 1+2*5개, 2+2+1+1 * 6개, 3+1+1+1*4개, 3+2+1 6개, 3+3 1개
dp[7] = 44
"""

dp[4]을 보면, dp[4] = dp[3] + dp[2] + dp[1] = 4 + 2 + 1 = 7입니다.

따라서, i >= 4일 때, dp[i] =  dp[i-1] + dp[i-2] + dp[i-3] 입니다.

직관적으로 점화식을 찾았지만, 그 원리를 살펴본다면,

만약 N에 대해서 경우의 수를 찾을 때, 우리는 1,2,3만을 사용할 수 있으므로 다음 세가지 경우의 수가 있습니다.

(1) (N - 1) 에서 1 더하기 -> N-1을 만드는 경우의 수와 동일 = dp[N-1]
(2) (N - 2) 에서 2 더하기 -> N-2을 만드는 경우의 수와 동일 = dp[N-2]
(1) (N - 3) 에서 3 더하기 -> N-3을 만드는 경우의 수와 동일 = dp[N-3]

 

따라서 이를 구현한 최종 코드는 아래와 같습니다.

 

Code

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])
반응형
저작자표시 (새창열림)

'Algorithm PS > Dynamic Programing' 카테고리의 다른 글

[BOJ/백준] 1633번 최고의 팀 만들기 (Python 파이썬)  (0) 2023.02.06
[BOJ/백준] 2011번 암호코드 (Python 파이썬)  (0) 2023.02.06
[BOJ/백준] 1965번 상자넣기 (Python 파이썬)  (0) 2023.02.06
[BOJ/백준] 17212번 달나라 토끼를 위한 구매대금 지불 도우미 (Python 파이썬)  (0) 2023.02.06
[BOJ/백준] 2491번 수열 (Python 파이썬)  (0) 2023.02.06
    'Algorithm PS/Dynamic Programing' 카테고리의 다른 글
    • [BOJ/백준] 1633번 최고의 팀 만들기 (Python 파이썬)
    • [BOJ/백준] 2011번 암호코드 (Python 파이썬)
    • [BOJ/백준] 1965번 상자넣기 (Python 파이썬)
    • [BOJ/백준] 17212번 달나라 토끼를 위한 구매대금 지불 도우미 (Python 파이썬)
    great_park
    great_park
    GitHub : https://github.com/great-park

    티스토리툴바