[μκ³ λ¦¬μ¦-λ°±μ€(DP)] λ°±μ€ 2748(DP), 10870(Recursive) νΌλ³΄λμΉμ μ μ°¨μ΄
μ΄λ² ν¬μ€ν μμ λμ νλ‘κ·Έλλ°(DP, λμ κ³νλ², λ©λͺ¨μ΄μ μ΄μ νμ΄) μ λν κ°λ¨ν μ μμ λ¬Έμ νμ΄λ₯Ό ν΄λ³Ό κ²μ΄λ€
λμ κ³νλ²μ λν κΉμ μ΄ν΄μ μ΄λ‘ μ μ€λͺ μ μΆνμ μκ³ λ¦¬μ¦ μ΄λ‘ μμ λ€λ£¨κΈ°λ‘ νκ² λ€.
λμ κ³νλ²μ΄λ?
νΌλ³΄λμΉ μμ΄μ λμ κ³νλ²μ ννμ νκ³€ νλ€.
λμ νλ‘κ·Έλλ°μ ν° λ¬Έμ λ₯Ό μμ λ¬Έμ λ‘ λλμ΄ ν΄κ²°νλ €λ λ¬Έμ¬ ν΄κ²° μ λ΅μ΄λ€.
μ΄λ λΆν μ 볡과 νΉμ λ¬Έμ μ μ¬κ· νΈμΆ λΉμ·ν κ°λ μ΄μ§λ§ κ°μ₯ ν° μ°¨μ΄μ μ λ©λͺ¨μ΄μ μ΄μ (Memoization) μ νλλ μ νλλμ λ°λΌ λ¬λ Έλ€κ³ νλ€.
Memoization
λ©λͺ¨μ μ΄μ μ΄λ, DPμμ μμ λ¬Έμ λ€μ΄ ν΄κ²°λ λ ν΄λΉ κ²°κ³Όλ₯Ό μ μ₯νμ¬ λ€λ₯Έ λΆλΆμ λμΌν κ³μ°μ, μ μ₯λ κ²°κ³Όλ₯Ό μ¬μ©νλ κ²μ λ»νλ€.
λ©λͺ¨μ΄μ μ΄μ
μ ν¨κ³Όμ μΌλ‘ μ€λͺ
νκΈ° μν΄μλ νΌλ³΄λμΉ μμ΄μ μ΄μ©ν DPκ° κ°μ₯ ν¨μ¨μ μΈλ° ν λ² λ°λ‘ νμΈν΄λ³΄μ.
λ°±μ€ 10870λ² : μ¬κ·νΈμΆ

λ°±μ€ λ¬Έμ 10870 μ μ¬κ·νΈμΆμ μ΄μ©ν΄μ νΌλ³΄λμΉ μμ΄μ μμ±μν€λ κ²μ΄ λͺ©μ μΈλ° μλμ μ λ ₯μ μ λ΄λ³΄μ.
nμ΄ 20λ³΄λ€ μκ±°λ κ°μ μμ°μλ‘ μ νλμ΄ μλλ° μν μκ°μ 1μ΄μ΄λ€.
package stage.stage09_Recursive;
import java.util.Scanner;
public class Prob02_FibonacciNumvbers {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int num = input.nextInt();
System.out.println(fibonacci(num));
}
private static int fibonacci(int num){
if(num >= 2) return fibonacci(num - 1) + fibonacci(num - 2);
else return num;
}
}
μμ κ°μ μ½λλ‘ νΌλ³΄λμΉ μλ₯Ό μ¬κ·νΈμΆ νλ€λ©΄ μκ° λ³΅μ‘λλ 2^n μ΄ λ κ²μ΄λ€. νμ§λ§ λ¬Έμ μμ λ΄€λ―μ΄ nμ΄ 20λ³΄λ€ μκ±°λ κ°μ μμ°μλ₯Ό μ΄ μκ° λ³΅μ‘λμ μ μ©νλ€λ©΄

100λ§μ΄ μ‘°κΈ λλ μλ‘ 1μ΄μ 1μ΅λ² κ³μ°μ νλ€λ κ°μ νμ μΆ©λΆν νΌλ³΄λμΉλ₯Ό μ¬κ· νΈμΆλ‘μ¨ ν΄κ²°ν΄λ λλ€λ μ리λ€
νμ§λ§ nμ΄ μ»€μ§λ€λ©΄ μ΄λ»κ² λ κΉ?
μ΄λ¬ν λ¬Όμμμ λμ νλ‘κ·Έλλ°μ΄ μμνλ€.
λμ νλ‘κ·Έλλ°μ μκΉ μμμ λ§ νλ― λ©λͺ¨μ μ΄μ μΌλ‘ λ©λͺ¨λ¦¬μ λλΉλ₯Ό μ€μΈλ€κ³ νλλ° μμ κ°μ λ°©μμ μ¬κ· νΈμΆμ΄ μ¬κ°ν λ©λͺ¨λ¦¬μ λλΉκ° μλ€λ κ²μ μ μ μλ€.
private static int fibonacci(int num){
if(num >= 2) return fibonacci(num - 1) + fibonacci(num - 2);
else return num;
}
λ§μ½ n 6μ΄λ©΄

μ΄λ° μμΌλ‘ μ€λ³΅μ΄ κ³μ λμ λκ³ κ²°κ΅ νμμλ λ©λͺ¨λ¦¬μ λλΉκ° μ‘΄μ¬νλ€. λ°±μ€μ 2748λ²κ³Ό κ°μ΄ nμ΄ 90κΉμ§ νμ©λλ€λ©΄ λ€μκ³Ό κ°μ λμ νλ‘κ·Έλλ°μΌλ‘ ν΄κ²°ν΄μΌ λ°λμ§νλ€.
λ°±μ€ 2748λ² : λμ κ³νλ²

μ΄μ λν μ½λλ₯Ό λμ νλ‘κ·Έλλ°μ λ©λͺ¨μ μ΄μ μ μ΄μ©νμ¬ νμ΄λ³΄μλ©΄ λ€μκ³Ό κ°λ€. (μ½λλ₯Ό μ μ¬νκ² λ³΄κΈΈ λ°λλ€)
package stage.stage09_Recursive;
import java.util.Scanner;
public class Prob03_Fibonacci2 {
static long[] memo;
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
memo = new long[91]; // κΈ°μ΅ν 곡κ°μ΄ n λ§νΌμ΄λ―λ‘ n+1μ ν λΉ
int n = input.nextInt();
System.out.println(fibonacci(n));
}
private static long fibonacci(int n){
if(n <= 1) return n; //fibonacci(0) μ fibonacci(1)μ κ°κ° 0κ³Ό 1μ΄ λ―λ‘ λ°λ‘ return
else { // κ·Έλ μ§ μμ κ²½μ°
if(memo[n] > 0) return memo[n]; //λ©λͺ¨μ κ°μ΄ μ μ₯λ κ²½μ°
else memo[n] = fibonacci(n - 1) + fibonacci(n - 2); // κ°μ΄ μ μ₯λμ§ μμ κ²½μ°
return memo[n];
}
}
}
μμ κ°μ΄ static νλλ‘ memoλΌλ λ°°μ΄μ κ°μ λ΄κ³ ν λ² fibonacci() λ©μλκ° μνλλ©΄ memoμ κ°μ λ¨Όμ κ²μ¬ν λ€ memoμ λν κ²°κ³Όκ° μμ λλ§ μ¬κ·μ μΌλ‘ νΈμΆνλ λ°©μμ λ°λ‘ DPμ νμ΄λΌκ³ νλ€.