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 |