알고리즘/문제 풀이

2747번: 피보나치 수

Themion 2021. 12. 17. 17:17

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

 

2747번: 피보나치 수

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

www.acmicpc.net

n번째 피보나치 f(n)은 f(n - 1)  + f(n - 2)로 표현되는데, f(n - 1) = f(n - 2) + f(n - 3)이므로 마지막 두 피보나치 수를 저장한 뒤 피보나치 수를 출력하면 메모리와 시간을 적게 들이면서 피보나치 수를 계산할 수 있다.

#include <cstdio>

int main() {
    // 피보나치 수를 계산할 때 필요한 공간은 총 세 개이다
    // 두 개는 더할 수를 저장한 공간, 나머지 하나는 더한 수를 저장할 공간

    // fib[i % 3]: i번째 피보나치 수, n: 구할 피보나치 수의 순서
    int fib[3] = { 0, 1, }, n;
    // 구할 피보나치 수의 순서를 입력받은 뒤
    scanf("%d", &n);
    // n번째까지의 피보나치 수를 연산
    for (int i = 2; i <= n; i++)
        fib[i % 3] = fib[(i - 1) % 3] + fib[(i - 2) % 3];
    // n번째 피보나치 수를 출력한다
    printf("%d\n", fib[n % 3]);

    return 0;
}

'알고리즘 > 문제 풀이' 카테고리의 다른 글

2749번: 피보나치 수 3  (0) 2021.12.17
2748번: 피보나치 수 2  (0) 2021.12.17
2742번: 기찍 N  (0) 2021.12.17
2741번: N 찍기  (0) 2021.12.17
2740번: 행렬 곱셈  (0) 2021.12.17