본문 바로가기

IT/알고리즘

[백준 1788번] 피보나치 수의 확장(c++)

반응형

 

 

 

백준 1788번

 

 

 

 

www.acmicpc.net/problem/1788

 

1788번: 피보나치 수의 확장

첫째 줄에 F(n)이 양수이면 1, 0이면 0, 음수이면 -1을 출력한다. 둘째 줄에는 F(n)의 절댓값을 출력한다. 이 수가 충분히 커질 수 있으므로, 절댓값을 1,000,000,000으로 나눈 나머지를 출력한다.

www.acmicpc.net

 

 


백준 1788번
피보나치 수의 확장


 

제목 그대로 피보나치 수를 확장하여 만든 문제입니다.

문제에서 요구하는 대로 손으로 수를 적어보니, 0을 기준으로 음수와 양수 인덱스 값이 대칭을 이루더라고요.

 

F(3) = 2

F(2) = 1

F(1) = 1

F(0) = 0

F(-1) = 1

F(-2) = -1

F(-3) = 2

F(-4) = -1

 

단, 음수쪽 인덱스에서는 절대값이 짝수면 음수였습니다.

이런 점을 코드에 그대로 구현하면, for문 하나로 풀 수 있습니다.

따로 적용된 알고리즘 기법은 없고, 단순 구현으로 풀었답니다.

 

#include <iostream>
#define mod 1000000000
using namespace std;

int dp[1000001]={0,1,0};

int main(){
    int input;
    int index;
    cin >> input;
    if(input<0)
    {
        index = input *(-1);
    }
    else
    {
        index = input;
    }
    if(index == 0 )
    {
        cout << 0;
        cout << "\n";
        cout << 0;
        return 0;
    }
    for(int i = 2; i <= index; i++){
        dp[i] = (dp[i-1] + dp[i-2]) % mod;
    }
    dp[index] = dp[index] % mod;
    if(input < 0)//음수의 경우
    {
        if(index % 2 == 0)// 절대값이 짝수인 경우
        {
            cout << -1;
            cout << "\n";
            cout << dp[index];
            return 0;
        }
    }
    //그 외
    cout << 1;
    cout << "\n";
    cout << dp[index];
    

    return 0;
}

 

뭔가 더 좋은 방법이 있을 것도 같은 데, 생각나는 게 없네요....

반응형

'IT > 알고리즘' 카테고리의 다른 글

[백준 19577번] 수학은 재밌어 (C++/c++)  (0) 2021.04.26
[백준 2780번] 비밀번호 (C++ / c++)  (0) 2021.04.19