Programing/백준, 프로그래머스(C++)
[C++][백준 9095] 1, 2, 3 더하기 (DP)
hye3193
2025. 2. 13. 18:29
https://www.acmicpc.net/problem/9095
풀이
일단 그냥 무턱대고 값을 구해보면
dp[1] = 1
dp[2] = 2
dp[3] = 4
dp[4] = 7
dp[5] = 13
으로, 규칙성을 발견할 수 있다
dp[n] = dp[n - 1] + dp[n - 2] + dp[n - 3]과 같은 점화식을 찾을 수 있다
5를 만드는 경우의 수를 구할 때
4를 만드는 모든 경우의 수에 +1를 해주면 5를 만들 수 있고
3을 만드는 모든 경우의 수에 +2를 해주면 5를 만들 수 있고
2를 만드는 모든 경우의 수에 +3을 해주면 5를 만들 수 있다
(4 이상의 차이부터는 하나의 숫자만 더해서 목표 숫자에 도달할 수 없음)
따라서 4, 3, 2를 만들 수 있는 모든 경우의 수를 더해주면 그것이 곧 5를 만들 수 있는 모든 경우의 수가 되는 것이다
맨 뒤에 숫자를 더하면 해당 숫자가 다른 위치에 오는 경우의 수도 발생하지 않나 싶었는데, 2 나 3이 맨 뒤에 가는 경우는 n - 2나 n - 3에서 처리되고, 중간에 들어가는 경우는 n - 1의 경우의 수에서 처리되는 것을 확인할 수 있었다
제출 코드
#include <iostream>
using namespace std;
int dp[12];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
dp[1] = 1;
dp[2] = 2;
dp[3] = 4;
for (int i = 4; i < 12; i++)
dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3];
int t, n;
cin >> t;
while(t--)
{
cin >> n;
cout << dp[n] << '\n';
}
}