알고리즘

[백준] 24416번 : 알고리즘 수업 - 피보나치 수 1 _ JAVA ( 주석 설명 ) 본문

백준 - JAVA/동적 계획법 1

[백준] 24416번 : 알고리즘 수업 - 피보나치 수 1 _ JAVA ( 주석 설명 )

wch_s 2023. 2. 15. 23:53

1번

→ 기존 중복 계산이 포함된 재귀로 풀었던 문제를, DP(동적 프로그래밍)로 해결한 문제

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


public class Main {
    static int fib_count = 0;
    static int fibonacci_count = 0;
    static int[] ary;
    static int[] ary2;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); //버퍼에서 데이터를 읽어오는 방식으로 속도가 빠르다.
        int N = Integer.parseInt(br.readLine());
        ary = new int[N+1];
        ary2 = new int[N+1];

        fib(N);
        fibonacci(N);
//        fibonacci2(N);

        System.out.println(fib_count);
        System.out.println(fibonacci_count);

//        System.out.println(fibonacci(N));
//        System.out.println(fibonacci2(N));
    }


    //재귀 방식
    private static int fib(int n) {
        if(n==1 || n==2) {
            fib_count++;
            return 1;
        }

        else
            return fib(n - 1) + fib(n - 2);
    }

    //Bottom-up 방식, 아래에서부터 차근차근 구한다.
    private static int fibonacci(int n) {
        ary[1]=1;
        ary[2]=1;

        for(int i=3;i<=n;++i){
            fibonacci_count++;
            ary[i] = ary[i-1] + ary[i-2];
        }

        return ary[n];
    }

    //Top-down 방식, 위에서부터 아래까지 내려가며 맨 아래가 구해졌을 시 다시 올라와 위의 값을 구한다.
    private static int fibonacci2(int n) {
        if(n<=2){
            ary2[1]=1;
            ary2[2]=1;
        }

        if(ary2[n]>=1)
            return ary2[n];

        ary2[n] = fibonacci2(n-1) + fibonacci2(n-2);

        return ary2[n];
    }
}