본문 바로가기

algorithm/크래프톤 기본문제

백준 9095: 1, 2, 3 더하기

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

 

9095번: 1, 2, 3 더하기

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

www.acmicpc.net


시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율
1 초 (추가 시간 없음) 512 MB 116268 76714 52966 64.496%

문제

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

 

문제 접근법

다이나믹 프로그래밍의 기초 문제이다.

이 유형의 문제는 dp테이블을 작성하기 보다, 전계가 어떻게 되는지 파악하는 것이 더 빠르다.

1,2,3의 합을 나타내는 방법을 천천히 보면 2는 1이 두개가 합쳐진 것이고, 3은 1이 3개 혹은 2, 1 로 구성된 경우의 수가 추가된 것이다.

이 개념을 거꾸로 생각하면 그것이 dp테이블이 된다.

1, 2, 3 에 경우의 수를 초기값을 주고, i번째 의 경우에 수는 (i-1) + (i-2) + (i-3)가 된다.

이게 왜 되는지 궁금하다면 손으로 경우에 수를 전부 적은 후 뒤에 숫자가 무엇으로 끝나는 지 손으로 적어보고 i-1의 경우의 수에 1을 붙여보고, i-2의 경우의 수에 2를 붙여보고,  i-3의 경우의 수에 3을 붙여보면 왜 저런 식이 나오는지 이해 할 수 있다.

 

코드

import sys
input = sys.stdin.readline

T = int(input())
dp = [0] * (12 + 1)
dp[1] = 1
dp[2] = 2
dp[3] = 4
for i in range(4, 12 + 1):
	dp[i] = dp[i - 3] + dp[i - 2] + dp[i - 1]

for _ in range(T):
	n = int(input())
	print(dp[n])

'algorithm > 크래프톤 기본문제' 카테고리의 다른 글

백준 1149: RGB거리  (2) 2024.02.07
백준 2579: 계단 오르기  (2) 2024.02.07
백준 1931: 회의실 배정  (2) 2024.02.07
백준 2665 : 미로만들기  (2) 2024.01.25
백준 21606 : 아침 산책  (2) 2024.01.25