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

#문제

백준 1003번 피보나치 함수

#풀이

#include <iostream>

using namespace std;

int fibonacci(int n)
{
	if (n == 0)
	{
		return 0;
	}
	else if (n == 1 || n < 0)
	{
		return 1;
	}
	else
	{
		int prev1 = 0;
		int prev2 = 1;
		int fn = 0;

		for (int i = 1; i < n; ++i)
		{
			fn = prev1 + prev2;

			prev1 = prev2;
			prev2 = fn;
		}

		return fn;
	}
}

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

	int t, n;
	cin >> t;

	while (t--)
	{
		cin >> n;

		cout << fibonacci(n - 1) << " " << fibonacci(n) << '\n';
	}

	return 0;
}

#정리

n번째 피보나치 수열이 불리는데, 0과 1이 몇번이 호출되는지 차례로 출력하는 문제. 재귀 함수로 된 Fibonacci 함수 예시를 제공한다. 처음 시도에서는 변수 x, y를 만들어 각각 피보나치 함수 내 if (n == 0)if (n == 1)에서 증가연산을 하고 호출되는 갯수를 출력했다. 답은 맞았지만 시간초과로 문제는 틀렸다. 하지만 0의 호출 갯수는 Fibonacci(n - 1), 1의 호출 갯수는 Fibonacci(n)과 동일함을 알 수 있었다. 그리고 피보나치 수열을 반복문으로 작성할 경우 O(n)의 시간복잡도를 가지는데, 재귀함수의 경우 O(2^n)의 시간 복잡도를 가지기 때문에 성능 차이가 굉장히 크다. 코드를 반복문으로 변경하여 해결했다.




    Enjoy Reading This Article?

    Here are some more articles you might like to read next:

  • [백준] 10816번 숫자 카드 2 / C++
  • [백준] 1940번 주몽 / C++
  • [백준] 9613번 GCD 합 / C++
  • [백준] 11651번 좌표 정렬하기 2 / C++
  • [백준] 10866번 덱 / C++