[백준] 9095 1, 2, 3 더하기 (C++)
9095 | 1, 2, 3 더하기
🙋♀️ 문제
정수 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의 합으로 나타내는 방법의 수를 출력한다.
🙋♂️ 예제 입출력
3
4
7
10
7
44
274
🚀 코드
#include <iostream>
#include <cstdlib>
#include <vector>
using namespace std;
vector<int> dpTable(12);
void dp(int n) {
dpTable[0] = 0;
dpTable[1] = 1;
dpTable[2] = 2;
dpTable[3] = 4;
for (int i = 4; i <= n; i++) {
dpTable[i] = dpTable[i - 1] + dpTable[i - 2] + dpTable[i - 3];
}
cout << dpTable[n] << '\n';
return;
}
int main() {
ios::ios_base::sync_with_stdio(false);
cin.tie(NULL);
int t = 0;
int n = 0;
cin >> t;
for (int i = 0; i < t; i++) {
cin >> n;
dp(n);
}
return 0;
}
🌠 메모
딱 보자마자 다이나믹 프로그래밍을 써서 풀고 싶었다. 역시나 점화식을 생각하는 것이 가장 큰 문제였다.
살짝 감이 왔는데 앞에 구한 숫자에 1, 2, 3을 더하면 되는건가? 근데 그러면 순서는 어떡하지? 생각에 빠져 점화식은 한번에 찾지 못하였다.
4의 경우,
- 1 + ‘3’
- 1 + 1 + ‘2’, 2 + 2’
- 1 + 1 + 1 + ‘1’, 1 + 2 + ‘1’, 2 + 1 + ‘1’
로 이루어져 있는데, 앞에 하이라이팅 되지 않은 부분은 각각
dpTable[1], dpTable[2], dpTable[3]
에 저장된 부분이다. 즉 n의 경우,n-1, n-2, n-3의 경우
에 각각 1을 더하는 방법, 2를 더하는 방법, 3을 더하는 방법으로 이루어져 있을 것이다.
따라서 점화식은 dpTable[i] = dpTable[i - 1] + dpTable[i - 2] + dpTable[i - 3]으로 간단하게 세울 수 있다.
이 문제의 경우는 n이 최대 11까지라서 꼭 다이나믹 프로그래밍으로 풀지 않아도 되는데, [백준] 15988 1, 2, 3 더하기 3 문제의 경우에는 오버플로우도 있고 꼭 dp로 풀어야만 하는 문제이다.
# 카테고리
- BOJ 36
- Algorithm 12
- CodingTest 11
- Web 9
- Javascript 8
- Vue 7
- React 7
- DBProject 4
- Python 3
- Tech-interview 3
- Express 3
- Next 3
- Github 2
- Django 2
- C 1
- C++ 1
- WebGame 1