본문 바로가기
알고리즘 문제 풀이/백준

백준 2748 피보나치 수 2 c++

by 옹구스투스 2021. 4. 7.
반응형

문제 출처 : www.acmicpc.net/problem/2748

 

2748번: 피보나치 수 2

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

www.acmicpc.net

문제

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

출력

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

알고리즘 분류

풀이

dp(동적 계획법) 기본 문제다.

동적 계획법이란 재귀 함수의 호출에 있어서, 이미 구한 값은 저장을 해놓고, 재사용함으로써

재귀 함수의 중복 호출을 없앤다.

fiboData의 크기가 50정도부터 int형이 나타낼 수 있는 범위를 초과하기 때문에,

long long으로 선언해 줘야 한다.

기본적으로 dp는 재귀로 구현되며, 탈출 조건은 n==0, n==1일 때 각각 0, 1을 리턴한다.

fiboData[n]==0이면, 즉 fibo(n)값이 아직 구해지지 않았으면,

n-1,n-2를 더한 값을 fiboData[n]에 넣어주고,

fiboData[n]==0이면 바로 fiboData[n]값을 리턴해준다.

코드

#include<iostream>

using namespace std;
long long fiboData[91];
long long fibo(int n) {
    if (n == 0) {
        return 0;
    }
    else if (n == 1) {
        return 1;
    }
    else if (fiboData[n] == 0) {
        fiboData[n] = fibo(n - 1) + fibo(n - 2);
    }
    return fiboData[n];
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(0);

    int n;
    cin >> n;
    cout << fibo(n);

    return 0;
}
반응형

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

백준 9461 파도반 수열 c++  (0) 2021.04.08
백준 1904 01타일 c++  (0) 2021.04.08
백준 1003 피보나치 함수 c++  (0) 2021.04.07
백준 7562 나이트의 이동 c++  (0) 2021.04.07
백준 2606 바이러스 c++  (0) 2021.04.07

댓글