문제가 직관적이고, 유명한 카테고리여서 추가적으로 설명할 점은 크게 없는 것 같다. 처음에는 무작정 배열에다가 값을 때려넣어서 결과를 도출했었는데, 문제를 조금 더 생각 해 보니 굳이 그럴 필요가 없었다. 그래서 배열을 지우고 담아두는 공간은 세 개 만으로 처리 할 수 있게끔 수정 해 보았다.
하단은 다시 작성 해 본 코드! 둘 다 정답이긴 하다.
알고리즘에 정답은 없다지만 오답과 더 나은 답은 있는 것 같다.
문제를 풀고 풀었다고 땡 칠 게 아니라 더 개선할 수 있는 점이 있었는지, 내 코드가 별로이지는 않는지 많이 생각 해 봐야겠다는 생각이 들었다.
// 문제 :: 피보나치 수
// 피보나치 수는 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번째 피보나치 수를 구하는 프로그램을 작성하시오.
// 링크 :: https://www.acmicpc.net/problem/2747
// 입력 :: 첫째 줄에 n이 주어진다. n은 45보다 작거나 같은 자연수이다.
// 출력 :: 첫째 줄에 n번째 피보나치 수를 출력한다.
//#include "Class2.h"
#include <iostream>
using namespace std;
int main()
//int Solve2747()
{
// cout << "[디버깅용] Solve2747 :: 시작지점 >> \n";
cin.tie(NULL);
ios_base::sync_with_stdio(false);
long long nArray[46] = { 0, };
long long nResult = 0;
int numN;
cin >> numN;
nArray[0] = 0;
nArray[1] = 1;
nArray[2] = 1;
for (int i = 2; i <= numN; i++)
{
nArray[i] = nArray[i - 1] + nArray[i - 2];
}
cout << nArray[numN];
return 0;
}
// 문제 :: 피보나치 수
// 피보나치 수는 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번째 피보나치 수를 구하는 프로그램을 작성하시오.
// 링크 :: https://www.acmicpc.net/problem/2747
// 입력 :: 첫째 줄에 n이 주어진다. n은 45보다 작거나 같은 자연수이다.
// 출력 :: 첫째 줄에 n번째 피보나치 수를 출력한다.
//#include "Class2.h"
#include <iostream>
using namespace std;
int main()
//int Solve2747()
{
// cout << "[디버깅용] Solve2747 :: 시작지점 >> \n";
cin.tie(NULL);
ios_base::sync_with_stdio(false);
long long nMemo, nResult = 0;
int numN;
cin >> numN;
nMemo = 1;
nResult = 1;
for (int i = 2; i < numN; i++)
{
long long nTemp = nResult;
nResult = nMemo + nResult;
nMemo = nTemp;
//cout << nResult << "\n";
}
cout << nResult << "\n";
return 0;
}