백준

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

하루우울루 2023. 7. 27. 13:29

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

 

24416번: 알고리즘 수업 - 피보나치 수 1

오늘도 서준이는 동적 프로그래밍 수업 조교를 하고 있다. 아빠가 수업한 내용을 학생들이 잘 이해했는지 문제를 통해서 확인해보자. 오늘은 n의 피보나치 수를 재귀호출과 동적 프로그래밍

www.acmicpc.net


Code

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.PriorityQueue;

public class Main {
	
	static int countfib = 0; // 재귀호출 사용 시 호출 횟수
	static int countfibo = 0; // dp 사용 시 호출 횟수
	
	public static void main(String[] args) throws IOException {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		int n = Integer.parseInt(br.readLine()); // n 받기
		int[] f = new int[n]; // 동적배열 선언
		
 		f[0] = 1; // 첫 번째와 두 번째 수 1로 초기화
 		f[1] = 1;
		
		fib(n);// 재귀호출 사용
		fibonacci(n,f); // dp 사용
		
		bw.write(countfib+" "+countfibo); // 출력
		
		br.close();
		bw.close();
	}
	
	static int fib(int n) { // 재귀호출
	    if (n == 1 || n == 2) {
	    	countfib++;
	    	return 1;  
	    }
	    else{
	    	return (fib(n - 1) + fib(n - 2));
	    }
	}
	
	static int fibonacci(int n,int[] f) { // dp
	    for(int i=2;i<n;i++) {
	    	f[i] = f[i - 1] + f[i - 2]; 
	    	countfibo++;
	    }
	        
	    return f[n-1];
	}
	
	
}

문제에 재귀호출과 dp 코드가 있는 만큼 호출 횟수만 처리하는 코드만 작성하면 돼서 쉽게 풀었다.