[Java][백준] #2747 - 피보나치 수

배수연·2024년 3월 22일

algorithm

목록 보기
19/45

🔗 백준 2747 - 피보나치 수

문제

알고리즘 분류

  • 수학
  • 구현

풀이

처음 시도했던 코드

  • 시간초과
    -> DP로 풀기로 했음
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        System.out.println(fibo(n));
    }
    public static int fibo(int n){
        if(n == 0) return 0;
        if(n == 1) return 1;
        return fibo(n-1) + fibo(n-2);
    }
}

1. dp 선언 및 초기화

  • int 배열을 선언하고,
  • 피보나치 수열에서 f(0) = 0, f(1) = 1이므로 배열에 저장하고, 나머지는 -1로 초기화
    static int[] dp;
	...
        dp = new int[n+1];
        dp[0] = 0;  dp[1] = 1;
        for(int i = 2; i<=n; i++){
            dp[i] = -1;
        }
        dp[n] = fibo(n);

2. 함수 구현

  • 배열에 값이 저장되어있지 않다면 재귀를 통해 계산하여 저장
    public static int fibo(int n){
        if(dp[n] == -1){
            dp[n] = fibo(n-1) + fibo(n-2);
        }
        return dp[n];
    }

전체 코드

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

public class Main {
    static int[] dp;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        dp = new int[n+1];
        dp[0] = 0;  dp[1] = 1;
        for(int i = 2; i<=n; i++){
            dp[i] = -1;
        }
        dp[n] = fibo(n);
        System.out.println(dp[n]);
    }
    public static int fibo(int n){
        if(dp[n] == -1){
            dp[n] = fibo(n-1) + fibo(n-2);
        }
        return dp[n];
    }
}

  • 피보나치 응용은 풀어봤지만 기본 문제를 안 풀어봐서 골랐는데.. 응용 풀어봤으면 굳이 안 풀어봐도 될 듯

0개의 댓글