알고리즘
[백준] 24416번 : 알고리즘 수업 피보나치 수 1 - JAVA
DoosanBaek
2024. 11. 14. 13:07
문제 분석 :
- 재귀 호출에 비해 동적 프로그래밍이 얼마나 빠른지 확인
- 아래의 의사 코드를 이용하여 n의 피보나치 수를 구할 경우 코드 1 코드 2 실행 횟수를 출력
제약 조건 :
- 첫째 줄에 n(5 ≤ n ≤ 40)이 주어진다.
- 코드 1 코드 2 실행 횟수를 한 줄에 출력한다.
의사 결정 :
- BufferedReader 사용, readLine() 으로 N을 입력 받아 읽는다.
- 재귀 방식으로 피보나치 수 계산
- 동적 프로그래밍 방식으로 피보나치 수 계산
- 재귀 / 동적 계산 호출 수 출력
내 풀이
package com.doosane.study01.week01.bronze;
/*
문제 분석 :
- 재귀 호출에 비해 동적 프로그래밍이 얼마나 빠른지 확인
- 아래의 의사 코드를 이용하여 n의 피보나치 수를 구할 경우 코드1 코드2 실행 횟수를 출력
제약 조건 :
- 첫째 줄에 n(5 ≤ n ≤ 40)이 주어진다.
- 코드1 코드2 실행 횟수를 한 줄에 출력한다.
의사 결정 :
- BufferedReader 사용, readLine() 으로 N을 입력 받아 읽는다.
- 재귀 방식으로 피보나치 수 계산
- 동적 프로그래밍 방식으로 피보나치 수 계산
- 재귀 / 동적 계산 호출 수 출력
*/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class week02_01_BOJ_24416 {
private static int jaguiProgramCount = 0; // 재귀 호출 실행 횟수 카운트
private static int dongjeokProgramCount = 0; // 동적 프로그래밍 실행 횟수 카운트
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(reader.readLine().trim());
// 재귀 호출 방식으로 피보나치 수 구하고 실행 횟수 카운트
fibonacciJaguiProgram(N);
// 동적 프로그래밍 방식으로 피보나치 수 구하고 실행 횟수 카운트
fibonacciDongjeockProgram(N);
// 결과 출력 (문제에서 요구한 대로, 코드1, 코드2 실행 횟수 출력)
System.out.println(jaguiProgramCount + " " + dongjeokProgramCount);
}
// 재귀 방식의 피보나치 수 계산
private static int fibonacciJaguiProgram(int n) {
if (n == 1 || n == 2) {
jaguiProgramCount++; // 코드1 실행 횟수 증가
return 1;
} else {
return fibonacciJaguiProgram(n - 1) + fibonacciJaguiProgram(n - 2);
}
}
// 동적 프로그래밍 방식의 피보나치 수 계산
private static int fibonacciDongjeockProgram(int n) {
int[] dongjeockProgram = new int[n + 1];
dongjeockProgram[1] = dongjeockProgram[2] = 1;
for (int i = 3; i <= n; i++) {
dongjeockProgram[i] = dongjeockProgram[i - 1] + dongjeockProgram[i - 2];
dongjeokProgramCount++; // 코드2 실행 횟수 증가
}
return dongjeockProgram[n];
}
}