문제 출처

1. 문제설명


  • 정수 n이 주어졌을 때,
  • n을 1, 2, 3의 합으로 나타내는 방법의 수를 구하라



2. 알고리즘 설계


  • DP 문제이다.
  • 점화식을 찾아야 하는데, 점화식이 생각보다 간단했다.
  • N-3, N-2, N-1번째의 경우의 수를 더해주면 N번째 경우의 수가 된다.



3. 로직


  • DP[N] = DP[N-1] + DP[N-2] + DP[N-3]
  • 테스트 케이스에 따라 계속 호출하는 것보다,
  • 한번 최대 크기까지 돌려놓는 게 더 효율적이라고 생각한다.



4. 전체 코드


#include <bits/stdc++.h>
using namespace std;

int memo[11];

void DP(void) {
    memo[1] = 1;
    memo[2] = 2;
    memo[3] = 4;

    for (int i = 4; i <= 10; i++)
        memo[i] = memo[i - 1] + memo[i - 2] + memo[i - 3];
}

int main(void) 
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    DP();
    int TC; cin >> TC;
    while (TC--) {
        int n; cin >> n;
        cout << memo[n] << '\n';
    }

    return 0;
}