개발아 담하자

[백준/C++]9095번 : 1, 2, 3 더하기 풀이 본문

👩‍💻 알고리즘 풀이/백준

[백준/C++]9095번 : 1, 2, 3 더하기 풀이

choidam 2020. 1. 26. 00:36

문제 9095 : 1, 2, 3 더하기

문제 링크 : https://www.acmicpc.net/problem/9095

 

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보다 작다. 출력 각

www.acmicpc.net

 

문제

 

정수 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 문제지만 역시나 삽질을 했다 .. 

f(n) = f(n-1) + f(n-2) + f(n-3) 을 이해했다면 바로 풀 수 있다. (직접 구해보면 빠를듯..!)

 

 

#include <iostream>

using namespace std;
int cache[11];

void dp(){
    cache[1] = 1; // 1
    cache[2] = 2; // 1+1, 2
    cache[3] = 4; // 1+1+1, 1+2, 2+1, 3
    
    for(int i=4; i<=11; i++){
        cache[i] = cache[i-1] + cache[i-2] + cache[i-3];
    }
}

int main(void){
    
    int t, n;
    cin >> t;
    dp();
    
    for(int i=0; i<t; i++){
        cin >> n;
        cout << cache[n] << endl;
    }
    return 0;
}