알고리즘/PS

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

BigmacGood 2022. 3. 21. 22:48

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

 

1003번: 피보나치 함수

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

www.acmicpc.net

 

백준 1003번을 풀어봤습니다.

간단한 다이나믹 프로그래밍 문제입니다.

재귀 함수를 그대로 사용하면 시간이 너무 오래걸려서 결과값을 저장하는 배열을 만들어주면 됩니다.

재귀 함수 첫 부분에 이미 계산한 값인지만 체크해주는 if문만 만들면 됩니다.

 

아래는 전체 코드입니다.

#include <iostream>
using namespace std;

int callCount[40][2];


pair<int,int> fibonacci(int n) {
    if (callCount[n][0] != 0 || callCount[n][1] != 0) {
        return pair<int, int>(callCount[n][0], callCount[n][1]);
    }

    if (n == 0) {
        //printf("0");
        return pair<int, int>(1, 0);

    }
    else if (n == 1) {
        //printf("1");
        return pair<int, int>(0, 1);
    }
    else {
        int f1 = fibonacci(n - 1).first;
        int s1 = fibonacci(n - 1).second;
        int f2 = fibonacci(n - 2).first;
        int s2 = fibonacci(n - 2).second;
        callCount[n][0] = f1 + f2;
        callCount[n][1] = s1 + s2;
        return pair<int, int>(f1 + f2, s1 + s2);

    }
}

int main() {
	callCount[0][0] = {1};
	callCount[1][1] = {1};

	int t, n;
	cin >> t;

	while (t--) {
		cin >> n;
        fibonacci(n);
        cout << callCount[n][0] << ' ' << callCount[n][1] << '\n';
	}

    return 0;
}

 

'알고리즘 > PS' 카테고리의 다른 글

[C++] 백준 1697 : 숨바꼭질  (0) 2022.03.22
[C++] 백준 7569 : 토마토  (0) 2022.03.22
[C++] 백준 7576 : 토마토  (0) 2022.03.18
[C++] 백준 2178 : 미로찾기  (0) 2022.03.18
[C++] 백준 1012 : 유기농 배추  (0) 2022.03.17