PS

BOJ 6504 : 킬로미터를 마일로

lickelon 2024. 2. 20. 22:59
  • 문제 링크 : boj.kr/6504
  • 난이도 : S5
  • 태그 : 구현
 

6504번: 킬로미터를 마일로

각각의 킬로미터 거리 x에 대해서, 상근이의 알고리즘을 이용해 마일로 바꾼 값 y를 출력한다.

www.acmicpc.net


코드

#include <bits/stdc++.h>

#define all(x) (x).begin(), (x).end()

#define INF 0x7FFFFFFF

using namespace std;

using ll = long long;
using ld = long double;
using pii = pair<int,int>;
using pll = pair<ll, ll>;

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

    vector<int> fibo;
    fibo.emplace_back(1);
    fibo.emplace_back(2);
    while(true) {
        int new_fibo = fibo[fibo.size()-1] + fibo[fibo.size()-2];
        if(new_fibo > 25000) break;
        fibo.emplace_back(new_fibo);
    }
    reverse(all(fibo));

    int t;
    cin >> t;
    while(t--) {
        int x;
        cin >> x;

        vector<int> binary(fibo.size(), 0);
        for(int i = 0; i < fibo.size(); i++) {
            if(x >= fibo[i]) {
                x -= fibo[i];
                binary[i] = 1;
            }
        }

        int ans = 0;
        for(int i = 0; i < fibo.size()-1; i++) {
            if(binary[i]) ans += fibo[i+1];
        }

        cout << ans << "\n";
    }

    return 0;
}

풀이

피보나치 진법을 구하려면 해당 정수를 넘지 않는 가장 큰 피보나치 수를 포함하면 된다.

 

매 정수마다 피보나치 수열을 구하지 말고 미리 피보나치 수열을 구해놓으면 수행 시간을 단축할 수 있다.

'PS' 카테고리의 다른 글

BOJ 31418 : 스펀지  (0) 2024.02.22
BOJ 31423 : 신촌 통폐합 계획  (0) 2024.02.21
BOJ 31420 : 문자열 - 그래프 매칭  (1) 2024.02.19
BOJ 31422 : AND, OR, XOR 2  (0) 2024.02.18
BOJ 29155 : 개발자 지망생 구름이의 취업 뽀개기  (0) 2024.02.17