본문 바로가기

개인 공부/알고리즘

[백준 알고리즘] 9095번 1,2,3 더하기

728x90
반응형

문제

정수 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보다 작다.

3
4
7
10

출력

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

7
44
274

풀이

이 문제는 1부터 입력한 n값까지 1, 2, 3만을 사용하여 구하는 입력한 n값을 구하는 방법의 개수를 구해야 한다.

처음 문제를 보고 어떻게 접근을 해야할지 몰랐지만 알고리즘 분류를 보고 dp을 사용하여 구한다는 것을 알게 되었다.

dp문제는 점화식을 구하고 접근을 하면 쉽게 구할 수 있기 때문에 점화식을 가장 먼저 알기 위하여 반복되는 규칙을 찾았다.

이 문제에 점화식을 구하게 되면 다음과 같다.

dp[n] = dp[n-1] + dp[n-2] + dp[n-3]

점화식을 구한 과정은 아래 사진과 같다.

이 문제는 규칙을 찾기 굉장히 오래걸리고 까다로웠다.

쉽게 표현하기 위해 표로 정리 안했을 경우 한눈에 단번에 알아보기 힘들었을 것이다.

코드

import sys

cnt = int(sys.stdin.readline())

# n = 1 / n = 2 / n = 3일때의 갯수
dp = [1, 2, 4]
input_list = []

for _ in range(cnt):
    input_list.append(int(sys.stdin.readline()))

# 3까지의 값이 있기 때문에 3부터 시작
for i in range(3, max(input_list)):
    dp.append(dp[i-1] + dp[i-2] + dp[i-3])

for i in input_list:
    print(dp[i-1])
728x90
반응형