수학에서 피보나치 수(Fibonacci numbers)는 첫째 및 둘째 항이 1이며 그 뒤의 모든 항은 바로 앞 두 항의 합인 수열이다. 처음 여섯 항은 각각 1, 1, 2, 3, 5, 8이다. 편의상 0번째 항을 0으로 두기도 한다.
재귀함수를 통해 푸는 방법은 가장 기본적이지만 수가 커질수록 함수 오버플로우가 발생한다. 즉, 시간초과.
#include <string>
#include <vector>
using namespace std;
int fibonacci(int n)
{
if(n == 1 || n == 2)
return 1;
return fibonacci(n - 1) + fibonacci(n - 2);
}
시간초과를 해결하는 방법은 Bottom to Top 의 방향으로 쉽게 구현할 수 있다.
n번째 피보나치 수를 구하기 위해 이전 값들은 참조만 하는 형식으로 해야한다.
#include <string>
#include <vector>
using namespace std;
int fibonacci(int n)
{
vector<int> fibo; // 0, 1을 넣고 시작
fibo.emplace_back(0);
fibo.emplace_back(1);
for(int i = 2; i<= n; i++)
{
fibo[2] = fibo[0] + fibo[1]; // 항상 (n-1) + (n-2)의 값이 저장됨
fibo[0] = fibo[1];
fibo[1] = fibo[2];
}
return fibo[2];
}
'::public > 코딩테스트 풀이' 카테고리의 다른 글
백 트래킹(backtracking) (0) | 2023.08.13 |
---|---|
하노이의 탑 (0) | 2023.08.13 |
문자열 밀기 (0) | 2023.08.08 |
OX퀴즈 - 문자열 파싱 (0) | 2023.08.08 |
손익분기점 (0) | 2019.11.09 |