BOJ

백준 2748번 피보나치 수 2 [C언어]

Sloth Coder 2022. 8. 15. 23:37

Sol)

#include <stdio.h>

int main()
{
    unsigned long long fibo[91] = {0, 1};
    int n = 0;

    for(int i = 2; i < sizeof(fibo) / sizeof(long long); i++){
        fibo[i] = fibo[i - 1] + fibo[i - 2];
    }

    scanf("%d", &n);

    printf("%llu\n", fibo[n]);

    return 0;
}

 

피보나치 수 2 문제는 전에 풀었던 피보나치 수 문제와 기본 로직은 같다. 단지 n의 범위가 90까지 커졌다는 변화만 있을 뿐이다. 전에 n이 훨씬 더 커지면 포인터로 동적 할당을 해야겠다고 했는데, 지금 생각해보니 어차피 문제에서 n의 최대값이 정해져 있을텐데 굳이 느린 malloc함수를 써가면서까지 그래야할까 싶었다. 그냥 배열을 최대값 만큼 선언하는 게 빠를 것 같다. 

 

이 문제에서는 내가 전 문제에서 추가로 생각하지 못한 부분, 바로 자료형의 크기에 관해 물어보는 문제였다. 피보나치 수는 n값이 커지면 계속해서 양의 방향으로 늘어나기 때문에 일정 n을 넘어가면 int값으로는 담을 수 없게 된다. 따라서 넉넉하게 unsigned long long형으로 배열을 만들어 주었다. unsigned가 붙을 수 있는 이유는, 어차피 피보나치 수열의 수들은 0이상이기 때문이다. 

unsigned long long 자료형의 표현 가능 정수 범위: 0 ~ 18,446,744,073,709,551,615