[C++]백준9009번 피보나치

less than 1 minute read

오늘은 백준9009번 피보나치 문제를 풀어보도록 하자.

기초적인 수학적인 지식을 요구하는 문제이다. 어렵지는 않으니 접근법에서 알아봅시다 :)

문제는 다음과 같다.

                               [접근법]

  1. 우선 배열을 만들고 피보나치를 적용하여 10억보다 작은 수 까지만 저장한다. 그 후 idx에 최대 인덱스를 저장 !
  
  2. 예를 들어 100이라는 숫자가 제시되었으면 배열의 맨 끝에서부터 크기를 비교 후, 100보다 작은 값이 나오면 벡터에 넣어줍니다.

  3. 그 후, 100보다 작은 값을 쳐음 만나는 89를 뺀 11로 값을 갱신해주고 위 알고리즘을 반복하면 끝 ! :)
                                     [코드]
#include <iostream>
#include <vector>
using namespace std;

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

	int n, idx, num;
	int arr[1001];
	vector<int>v;
	arr[0] = 0;
	arr[1] = 1;
	arr[2] = 1;

	cin >> n;

	for (int i = 3;; i++) {
		arr[i] = arr[i - 1] + arr[i - 2];
		idx = i;
		if (arr[i] > 1000000000) {
			arr[i] = -1;
			idx -= 1;
			break;
		}
	}

	while (n--) {
		cin >> num;
		for (int i = idx; i >= 1; i--) {
			if (num >= arr[i]) {
				v.push_back(arr[i]);
				num -= arr[i];
			}
		}
		for (int i = v.size() - 1; i >= 0; i--) {
			cout << v[i] << ' ';
		}
		cout << '\n';
		v.clear();
	}
}