감사쟁이야
감사쟁이의 성장기록
감사쟁이야
  • 분류 전체보기 (130)
    • Java-Spring (0)
    • ComputerScience (0)
    • Project (64)
      • TIL, WIL (57)
      • Project Retrospect (7)
    • Problem Solving (63)
    • Book Review (1)
    • Culture & Discovery (0)
    • Daily Log (2)

블로그 메뉴

  • 홈
  • 깃허브
  • 방명록
hELLO · Designed By 정상우.
감사쟁이야

감사쟁이의 성장기록

[백준] 9095 : 1, 2, 3 더하기 / python
Problem Solving

[백준] 9095 : 1, 2, 3 더하기 / python

2022. 5. 2. 16:04

1. 문제 설명

 

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

 

2. 풀이 전 계획과 생각

  • test_case → 테스트 케이스 수
  • 정수 → N

 

  • 구하고자 하는 바 : 각 N마다 N을 1, 2, 3의 합으로 나타낼 수 있는 방법의 수를 구하자.
    ⇒ DAG 구조다. 계산 중복을 방지하기 위해, DP로 해결해보자.
  • 작은 문제 : dp[i] ⇒ i를 1, 2, 3의 합으로 나타낼 수 있는 방법의 수
  • 풀고자 하는 문제 : dp[N] ⇒ N을 1, 2, 3의 합으로 나타낼 수 있는 방법의 수
  • base_case : dp[0] = 0 dp[1] = 1 dp[2] = 2 dp[3] = 4
  • 점화식 : dp[N]
    ⇒ 전체 경우의 수 = 각 Partition의 경우의 수들의 합이다.
    마지막에 1 더하는 경우들 + 1
    마지막에 2 더하는 경우들 + 2
    마지막에 3 더하는 경우들 + 3
    →
    마지막에 1 더하는 경우들 (합이 i-1인 경우들) + 1
    마지막에 2 더하는 경우들 (합이 i-2인 경우들) + 2
    마지막에 3 더하는 경우들 (합이 i-3인 경우들) + 3
    ⇒
    dp[i]
    = ((i-1)을 만들고 1 더하는 경우의 수) + ((i-2)을 만들고 2 더하는 경우의 수) + ((i-3)을 만들고 3 더하는 경우의 수)
    = dp[i - 1] + dp[i - 2] + dp[i - 3]

 

3. 풀이

def get_methods_num(N):
    dp = [0] * (N + 1)
    dp[0] = 0
    if N >= 1:
        dp[1] = 1
    if N >= 2:
        dp[2] = 2
    if N >= 3:
        dp[3] = 4

    for i in range(4, N + 1):
        dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3]
    return dp[N]

test_case = int(input())
for _ in range(test_case):
    N = int(input())
    print(get_methods_num(N))

 

4. 풀이 후 알게된 개념과 소감

  • 점화식을 어떻게 구해야 될지 모를 때,묶어낸 부분의 정답을 dp 배열을 이용해서 빠르게 계산해보자.
  • 먼저, dp[i] 계산에 필요한 탐색 경우를 공통점끼리 묶어내보자.

'Problem Solving' 카테고리의 다른 글

[백준] 3584 : 가장 가까운 공통 조상 / python  (0) 2022.05.09
[백준] 2579 : 계단 오르기 / python  (0) 2022.05.05
[프로그래머스] 보석 쇼핑 (2020 KAKAO INTERNSHIP) / python  (0) 2022.04.28
[SWEA] 등산로 조성 (모의 SW 역량 테스트) / python  (0) 2022.04.20
[SWEA] 디저트 카페 (모의 SW 역량테스트) / python  (0) 2022.04.16
    'Problem Solving' 카테고리의 다른 글
    • [백준] 3584 : 가장 가까운 공통 조상 / python
    • [백준] 2579 : 계단 오르기 / python
    • [프로그래머스] 보석 쇼핑 (2020 KAKAO INTERNSHIP) / python
    • [SWEA] 등산로 조성 (모의 SW 역량 테스트) / python
    감사쟁이야
    감사쟁이야
    sunzero0116@gmail.com

    티스토리툴바