백준 9009번 피보나치(Java)

HyunKyu Lee·2021년 12월 23일
0

백준 9009번 피보나치 문제
문제 링크

문제

피보나치 수 ƒK는 ƒK = ƒK-1 + ƒK-2로 정의되며 초기값은 ƒ0 = 0과 ƒ1 = 1 이다. 양의 정수는 하나 혹은 그 이상의 서로 다른 피보나치 수들의 합으로 나타낼 수 있다는 사실은 잘 알려져 있다.

하나의 양의 정수에 대한 피보나치 수들의 합은 여러 가지 형태가 있다. 예를 들어 정수 100은 ƒ4 + ƒ6 + ƒ11 = 3 + 8 + 89 또는 ƒ1 + ƒ3 + ƒ6 + ƒ11 = 1 + 2 + 8 + 89, 또는 ƒ4 + ƒ6 + ƒ9 + ƒ10 = 3 + 8 + 34 + 55 등으로 나타낼 수 있다. 이 문제는 하나의 양의 정수를 최소 개수의 서로 다른 피보나치 수들의 합으로 나타내는 것이다.

하나의 양의 정수가 주어질 때, 피보나치 수들의 합이 주어진 정수와 같게 되는 최소 개수의 서로 다른 피보나치 수들을 구하라.

입력

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

출력

출력은 표준출력을 사용한다. 하나의 테스트 데이터에 대한 해를 하나의 줄에 출력한다. 각 테스트 데이터에 대해, 피보나치 수들의 합이 주어진 정수에 대해 같게 되는 최소수의 피보나치 수들을 증가하는 순서로 출력한다.

접근방법

  • 먼저 하나의 양의 정수가 주어질 때 그 정수보다 작은수의 피보나치 리스트를 만든다.
  • 피보나치 수들의 합이 주어진 정수와 같게 되는 최소 개수를 구하는 것 이므로 구해놓은 피보나치 리스트를 내림차순으로 정렬하여 큰 수부터 주어진 정수와 비교하여 빼가며 0을 만든다.

정답코드

  
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

public class Main {

    static ArrayList<Long> solution(long num){
        ArrayList<Long> fivo = new ArrayList<>();
        ArrayList<Long> answer = new ArrayList<>();
        fivo.add(0L);
        fivo.add(1L);
        int index = 2;
        
		//주어진 수보다 작은 피보니치 리스트를 만든다
        while (true) {
            long plusNum = fivo.get(index - 1) + fivo.get(index - 2);
            if(plusNum > num) break;
            fivo.add(plusNum);
            index++;
        }

        Collections.sort(fivo,Collections.reverseOrder());
		
        //주어진 수를 피보나치 리스트에서 큰 값부터 빼가며 0 을 만든다.
        while(num != 0) {
            for (int i = 0; i < fivo.size(); i++) {
            	//빼줄 때 피보나치의 값이 num보다 큰지 확인
                if (fivo.get(i) <= num) {
                    num -= fivo.get(i);
                    answer.add(fivo.get(i));
                }
            }
        }

        Collections.sort(answer);
        answer.remove(0);
        return answer;
    }


    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int t = sc.nextInt();

        for (int i = 0; i < t; i++) {

            long num = sc.nextInt();

            for (long x : solution(num)) {
                System.out.printf(x + " ");
            }
            System.out.println();

        }

    }
}
profile
backend developer

0개의 댓글