알고리즘/백준
피보나치 수 C++
JiHxxn
2024. 7. 25. 17:39
📝 문제
https://www.acmicpc.net/problem/2747
문제 설명
피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그다음 2번째부터는 바로 앞 두 피보나치 수의 합이 된다.
이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n ≥ 2)가 된다.
n=17일때 까지 피보나치 수를 써보면 다음과 같다.
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597
n이 주어졌을 때, n번째 피보나치 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 n이 주어진다. n은 45보다 작거나 같은 자연수이다.
입출력 예 설명
예제 입력
10
예제 출력
55
첫 번째 풀이 코드 - 시간 초과
#include<iostream
using namespace std;
int Fibonacci(int _iNum);
int main()
{
int iSelect(0);
cin >> iSelect;
cout << Fibonacci(iSelect);
return 0;
}
int Fibonacci(int _iNum)
{
if (_iNum == 1 || _iNum == 2)
{
return 1;
}
return Fibonacci(_iNum - 1) + Fibonacci(_iNum - 2);
}
두 번째 풀이 코드 - 통과
#include<iostream>
#include<map>
using namespace std;
int Fibonacci(int _iNum);
map<int, int> FiboMap;
map<int, int>::iterator p;
int main()
{
int iSelect(0);
cin >> iSelect;
cout << Fibonacci(iSelect);
return 0;
}
int Fibonacci(int _iNum)
{
if (_iNum == 1 || _iNum == 2)
{
return 1;
}
if (FiboMap[_iNum] == false)
{
FiboMap[_iNum] = Fibonacci(_iNum - 1) + Fibonacci(_iNum - 2);
}
return FiboMap[_iNum];
}
- 이 문제를 해석해보면, 파라미터로 넣어준 정수 값의 피보나치 수를 구하는 문제이다. 피보나치 수를 구하려면 아래쪽부터 차근차근 피보나치 수를 계산해야 한다.
- 재귀 함수에 맞는 문제라고 생각했다.
✍️ 중요 포인트
- 첫 번째 시도는 시간 초과로 통과하지 못했다. 이유는 완전 탐색으로 모든 경우의 수를 확인했기 때문이다.
- 두 번째 시도는 DP(Dynamic Programming) 알고리즘을 사용하여 통과하였다. DP 알고리즘은 쉽게 말하면 이미 찾은 결과 값을 메모리에 저장(memoization)하여 다음번에 재활용하여 최적화하는 것이다.
- 첫 번째 시도는 완전 탐색으로 시간 복잡도 o(2n) 였다면 DP알고리즘을 사용한 두 번째 시도는 시간 복잡도 o(n)으로 줄일 수 있다.