‡ CODING TEST STUDY ‡/º 백준

[백준 1003번 C++] 피보나치 함수

Trudy | 송연 2023. 10. 7. 11:40

1003번: 피보나치 함수 (acmicpc.net)

 

1003번: 피보나치 함수

각 테스트 케이스마다 0이 출력되는 횟수와 1이 출력되는 횟수를 공백으로 구분해서 출력한다.

www.acmicpc.net


문제가 풀리는 가장 간단한 방법으로 풀었더니 시간초과가 떴다

#include <iostream>

using namespace std;

int z, o;

int fibonacci(int n) {
    if (n == 0) {
        z++;
        return 0;
    } else if (n == 1) {
        o++;
        return 1;
    } else {
        return fibonacci(n-1) + fibonacci(n-2);
    }
}

int main()
{
    int t, n;
    cin >> t;
    
    for(int i=0; i<t; i++){
        z = 0;
        o = 0;
        
        cin >> n;
        fibonacci(n);
        
        cout << z << " " << o <<"\n";
    }
    
    
    
    return 0;
}

다이나믹 프로그래밍을 사용해서 풀어야했던 것... 

 


DP를 사용하려면 규칙을 찾아야하는 데

 

n=0 일 때, 1 0 (0 한번 호출, 1 호출 x)

n=1 일 때, 0 1

n=2 일 때, fib(1) + fib(0) 니까 1 1

n=3 일 때, fib(1) + f(2) => f(1) + f(1) + f(0) 이니까 1 2

n=4 일 때, fib(2) + fib(3) => {fib(1) + fib(0)} + {fib(1) + f(1) + f(0)} 이니까 2 3

 

여기까지 구하다 보니까 0 1의 호출 횟수도 피보나치처럼 더해진다는 것을 알게 됨!

 

이 규칙을 사용해서 코드를 짜주니까 맞았당

 

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


int main() {
    int T, m;
    vector<pair<int, int>> v;
    
    cin >> T;
    
    v.push_back({1,0});
    v.push_back({0,1});
    
    int a, b;
    for(int i=2; i<=40; i++){
        a = v[i-1].first + v[i-2].first;
        b = v[i-1].second + v[i-2].second;
        v.push_back({a,b});
    }
    
    for(int i=0; i<T; i++){
        cin >> m;
        cout << v[m].first << " " << v[m].second << "\n";
    }

}