본문 바로가기
Develop/백준 (Cpp)

[백준] 2747번 : 피보나치 수 (C++)

by Tarra 2023. 1. 20.

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보다 작거나 같은 자연수이다.

 

 

 

출력 :

첫째 줄에 n번째 피보나치 수를 출력한다.

 

 

 

 

풀이)

피보나치 수를 구하는 방식을 그대로 for문을 이용해 구현하면 되는 문제이다.

 

이 문제는 n이 최대 45까지밖에 없으므로 그냥 정적 배열 ( int data[45] ) 을 이용해 문제를 풀어주었다.

 

 

정적 할당을 이용한 풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
using namespace std;
 
int main()
{
    int n;
    cin >> n;
 
    int data[45= { 01 };
 
    for (int i = 2; i < n + 1; i++) {
        data[i] = data[i - 1+ data[i - 2];
    }
 
    cout << data[n];
 
    return 0;
}
 
cs

 

만약 이 문제를 입력을 받은 크기만큼 배열이 커지는

 

동적 배열 할당을 이용해 문제를 푼다면 다음과 같이 나오게 된다.

 

동적 할당을 이용한 풀이

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
 
using namespace std;
 
int main()
{
    int n;
    cin >> n;
 
    // +2를 해줌으로써 메모리 영역을 여유롭게 설정해준다.
    int* data = new int[n + 2];
 
    data[0= 0;
    data[1= 1;
 
    for (int i = 2; i < n + 1; i++) {
        data[i] = data[i - 1+ data[i - 2];
    }
 
    cout << data[n];
 
    delete[] data;
 
    return 0;
}
cs
 

출처 : https://www.acmicpc.net/problem/2747 

 

2747번: 피보나치 수

피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다. 이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n ≥ 2)가

www.acmicpc.net