맨땅에 코딩

백준 1003번: 피보나치 함수 / C++ 본문

코딩 낙서장

백준 1003번: 피보나치 함수 / C++

나는 푸딩 2024. 7. 9. 15:22

어떤 문제일까?

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

 

문제에서 다음과 같이 피보나치 함수에 대한 소스를 제공해주었다

int fibonacci(int n) {
    if (n == 0) {
        printf("0");
        return 0;
    } else if (n == 1) {
        printf("1");
        return 1;
    } else {
        return fibonacci(n‐1) + fibonacci(n‐2);
    }
}

 

문제를 푸는데 아무 쓸모도 없었다

그냥 0과 1의 개수를 구하기 위해 피보나치로 풀어야하고, 시간복잡도 때문에 DP를 써야하는구나를 알 수 있었다.

엥 지금 다시 글을 쓰면서 생각해보니 쓸모가 있었다

 

피보나치 함수 DP로 만들기

int fibonacci(int n) {
	dp[0] = 0;
	dp[1] = 1;
	for (int i = 2; i <= n; i++) {
		dp[i] = dp[i - 1] + dp[i - 2];
	}
	return dp[n];
}

 

구글링 했을 때 나오는 피보나치 함수 틀은 위와 같다.

나는 0과 1의 개수를 세야하므로 피보나치 함수를 2개 만들어주었다.

이유는 0과 1의 개수가 약간의 차이가 있었기 때문이다.

 

0의 개수
1 0 1 1 2 3 5 8 13 21

1의 개수
0 1 1 2 3 5 8 13 21 34

 

이렇게 차이가 있었다.

 

해결

#include <iostream>
using namespace std;

int dpZero[50];
int dpOne[50];

int fibonacciZero(int n) {
	dpZero[0] = 1;
	dpZero[1] = 0;
	dpZero[2] = 1;
	for (int i = 3; i <= n; i++) {
		dpZero[i] = dpZero[i - 1] + dpZero[i - 2];
	}
	return dpZero[n];
}

int fibonacciOne(int m) {
	dpOne[0] = 0;
	dpOne[1] = 1;
	for (int i = 2; i <= m; i++) {
		dpOne[i] = dpOne[i - 1] + dpOne[i - 2];
	}
	return dpOne[m];
}

int main() {
	int t, num;
	cin >> t;
	for (int i = 0; i < t; i++) {
		cin >> num;
		cout << fibonacciZero(num) << " " << fibonacciOne(num) << "\n";
		
	}
	
	return 0;
}

'코딩 낙서장' 카테고리의 다른 글

백준 1002번: 터렛 / C++  (0) 2024.07.09
Git commit History 초기화, 삭제하는 법  (0) 2024.06.10