N을 입력받고 N에서 1뺀 수, 2를 뺀 수, 3을 뺀 수를 재귀함수에 넣어서 0으로 만듭니다.
0으로 정상적으로 만들어졌다는 것은ㄴ 1,2,3을 이용해 잘 더해졌다는 의미이므로 ans를 1 증가시켜 만들 수 있는 경우임을 체크합니다.
만약 계속 빼다가 0보다 작아졌다면 1,2,3을 조합해서 만들 수 없는 경우이므로 return 합니다. 예를들어 N=4일때, add(n-2)-> add(n-3)을 타고 들어갔다면 2+3=5이므로 이미 N을 넘었습니다. 이때 뺐으므로 0보다 작아졋으므로 이는 더해서 만들 수 없는 경우입니다.
DP로 문제 풀기
이 문제는 DP로 분류되어 있는 만큼 DP로도 풀 수 있습니다. 1을 만드는 경우는 1개 2를 만드는 경우는 2개 3을 만드는 경우는 4개 입니다. 그러면 4를 만드는 경우는 몇개일까요??? 예시에도 나와있듯이 7개입니다. 뭔가 보이지 않나요??? 네 바로 4개를 만드는 경우의 수는 1 + 2 + 4 = 7 입니다. 이 규칙을 찾아내셨다면 DP를 이용해 풀 수 있습니다. 피보나치와 같습니다
백준 9095 1,2,3 더하기 DP c++ 코드
#include <iostream>
#include <algorithm> // sort와 unique 사용
#include <vector>
using namespace std;
int N;
int cache[12];
void add() {
}
int main() {
// IO 속도 향상
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int T;
cin >> T;
cache[1] = 1;
cache[2] = 2;
cache[3] = 4;
for (int i = 0; i < T; i++) {
cin >> N;
if (cache[N] != 0) {
cout << cache[N] << endl;
}
else {
for (int j = 4; j <= N; j++) {
cache[j] = cache[j - 1] + cache[j - 2] + cache[j - 3];
}
cout << cache[N] << endl;
}
}
return 0;
}
백준 9095 1,2,3 더하기 재귀 java 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
class Main {
static int ans;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
for(int i=0; i<T; i++){
int N = Integer.parseInt(br.readLine());
add(N-1);
add(N-2);
add(N-3);
System.out.println(ans);
ans = 0;
}
br.close();
}
public static void add(int n){
if(n < 0) return;
if(n == 0){
ans++;
return;
}
add(n-1);
add(n-2);
add(n-3);
}
}