백준 #1003 - 피보나치 함수 (Java)

베이시스·2022년 6월 16일
0

알고리즘 - 백준

목록 보기
4/6
post-thumbnail
post-custom-banner

🔗 링크

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

✏️ 문제

재귀로 구현된 피보나치 함수를 사용할 때 종료 조건 fibonacci(0)과 fibonacci(1)이 몇 번 반복되는지 찾는 문제입니다.

🧠 접근

언제나 그렇듯 한번 써 봅시다.
피보나치 수를 구하는 함수를 f(n) (n0)(n \ge 0) 이라고 합시다.

f(0) 은 종료 조건이므로 f(0) 1회,f(1) 0회입니다.
f(1) 은 종료 조건이므로 f(0) 0회,f(1) 1회입니다.
f(2)f(1)f(0) 을 호출하므로 각각 1회입니다.
... 이런 방법으로 반복하면 아래와 같이 호출 횟수를 확인할 수 있습니다.

nfibonacci(0)fibonacci(1)
010
101
211
312
423
535
658

피보나치 수열이 보이시나요?

f(0) 의 호출 횟수는 n = 0 일 때 1, n 이 1 이상일 때에는 f(n - 1) 이 되고, f(1) 의 호출 횟수는 아예 피보나치 수열을 따르고 있는 것이 보이죠.

따라서 피보나치 수열의 값을 미리 구해 놓고 위 조건에 따라 출력하면 됩니다.

// 피보나치 수열을 미리 구함
int[] fibonacci = new int[40 + 1];
fibonacci[1] = 1;
for (int i = 2; i <= 40; i++) 
	fibonacci[i] = fibonacci[i - 1] + fibonacci[i - 2];
    
(...)
for (int i = 0; i < testCase; i++) {
	(...)
	int fZero, fOne;
    if (input == 0) {
    	fZero = 1;
        fOne = 0;
    } else {
    	fZero = fibonacci[input - 1];
        fOne = fibonacci[input];
    }
    (...)
}
(...)

문제가 전부 해결되었습니다.

📄 전체 소스 코드

import java.util.*;
import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder builder = new StringBuilder();
        int[] fibonacci = new int[40 + 1];
        fibonacci[1] = 1;
        for (int i = 2; i <= 40; i++) 
            fibonacci[i] = fibonacci[i - 1] + fibonacci[i - 2];
        
        int testCase = Integer.parseInt(reader.readLine());
        
        for (int i = 0; i < testCase; i++) {
            int input = Integer.parseInt(reader.readLine());
            int fZero, fOne;
            if (input == 0) {
                fZero = 1;
                fOne = 0;
            } else {
                fZero = fibonacci[input - 1];
                fOne = fibonacci[input];
            }
            builder.append(fZero + " " + fOne + "\n");
        } 
        System.out.print(builder.toString());
    }
}
profile
사진찍는 주니어 프론트엔드 개발자
post-custom-banner

0개의 댓글