본문 바로가기
PS/Baekjoon

[백준/C++] 9009번: 피보나치(S1)

by 이지이즤 2022. 1. 14.
728x90

 

문제

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

 

9009번: 피보나치

입력 데이터는 표준입력을 사용한다. 입력은 T 개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에는 테스트 데이터의 수를 나타내는 정수 T 가 주어진다. 각 테스트 데이터에는 하나의 정수 n

www.acmicpc.net

 

 

사용한 알고리즘

-> 내림차순 정렬. 방법2

 

 

풀이

  1. 벡터 v에 피보나치 수들을 미리 오름차순으로 push해준다.
  2. 테스트 케이스마다 정수 x를 입력받는다.
  3. 피보나치 수가 들어있는 벡터v를 거꾸로 (큰 수 부터) 순회한다.
    이 때 sum+피보나치 수 <= x 이면
    피보나치 수를 sum에 더해주고 ans 벡터에도 push해준다.
  4. sum이 x와 같아지면 break하고 ans벡터를 오름차순 출력한다.

 

소스코드

#include <iostream>
#include <vector>
#include <algorithm>
typedef long long ll;
using namespace std;

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

    // 1. 벡터 v에 피보나치 수들을 미리 오름차순으로 push해준다.
    vector<int> v;
    v.push_back(0);
    v.push_back(1);
    while(1){
        int tmp=v[v.size()-1]+v[v.size()-2];
        if(tmp>1000000000) break;
        v.push_back(tmp);
    }

    int len=v.size();
    int tc; cin>>tc;
    for(int i=0; i<tc; i++){
        // 2. 테스트 케이스마다 정수 x를 입력받는다.
        int x; cin>>x;
        vector<int> ans;
        int sum=0;

        /*
         3. 피보나치 수가 들어있는 벡터v를 거꾸로 (큰 수 부터) 순회한다.
            이 때 sum+피보나치 수 <= x 이면
            피보나치 수를 sum에 더해주고 ans 벡터에도 push해준다.
        */
        for(int j=len-1; j>=0; j--){
            if(sum+v[j]<=x){
                sum+=v[j];
                ans.push_back(v[j]);
            }
            // 4. sum이 x와 같아지면 break하고 
            if(sum==x) break;
        }
        // 4. ans벡터를 오름차순 출력한다.
        reverse(ans.begin(),ans.end());
        for(auto &k:ans) cout<<k<<" ";
        cout<<'\n';
    }


    return 0;
}
728x90

'PS > Baekjoon' 카테고리의 다른 글

[백준/C++] 5525번: IOIOI(S2)  (2) 2022.01.16
[백준/C++] 2437번: 저울(G3)  (0) 2022.01.14
[백준/C++] 1431번: 시리얼번호(S3)  (0) 2022.01.12
[백준/C++] 18870번: 좌표 압축(S2)  (0) 2022.01.11
[백준] 맞왜틀 체크리스트  (0) 2022.01.11

댓글