[백준/C++] 9507 - Generations of Tribbles

orangesnail·2025년 8월 29일

백준

목록 보기
165/169

https://www.acmicpc.net/problem/9507


처음에는 피보나치는 당연히 재귀로 푸는거라고 생각해서 아래처럼 재귀로 코드를 짰다.

#include <iostream>
using namespace std;

int koong(int n) {
    if (n < 2) return 1;
        else if (n == 2) return 2;
        else if (n == 3) return 4;
        else return koong(n - 1) + koong(n - 2) + koong(n - 3) + koong(n - 4);
}

int main() {
    int t;
    cin >> t;

    while (t--) {
        int n;
        cin >> n;
        cout << koong(n) << "\n";
    }

    return 0;
}

그런데 이 코드는 시간 초과가 떴다.

알고 보니 재귀로 풀게 되면 큰 수에서는 너무 가지를 많이 뻗게 되어서 시간이 오래 걸리는 것이었다. 따라서 이를 DP로 고쳐보았다. 아래 코드에서는 미리 0~67까지 다 계산해놓고 바로바로 답을 꺼내 쓰는 방식으로 작동한다.

#include <iostream>
#include <vector>
using namespace std;

int main() {
    int t;
    cin >> t;

    vector<long long> dp(68);
    dp[0] = 1;
    dp[1] = 1;
    dp[2] = 2;
    dp[3] = 4;
    for (int i = 4; i <= 67; i++) {
        dp[i] = dp[i-1] + dp[i-2] + dp[i-3] + dp[i-4];
    }

    while (t--) {
        int n;
        cin >> n;
        cout << dp[n] << "\n";
    }

    return 0;
}
profile
초보입니다. 피드백 환영합니다 😗

0개의 댓글