์ด๋ฒ ํฌ์คํ ์์ ๋์ ํ๋ก๊ทธ๋๋ฐ(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์ ํ์ด๋ผ๊ณ ํ๋ค.
๋๊ธ