์ค๋์ ์ฌ๊ทํจ์์ ์ฌ๊ท์ ์ฌ๊ณ ์ ๋ํด ํฌ์คํ ํ๊ฒ ๋ค. ์์งํ '์ฌ๊ท'๋ก ํ์ด์ผ ํ๋ ๋ฌธ์ ์๋ ์ฌ์ ํ ์ฝ๊ฐ? ์ซ์ง๋ง ๋ฐ๋ณต๋ง์ด ์ด๊ธธ์ด๋ค..ใ ใ

๐ก์ฌ๊ท ํจ์๋ ?
์ฌ๊ท ํจ์๋, ์๊ธฐ ์์ ์ ํธ์ถํ๋ ํจ์๋ก ๋ค์๊ณผ ๊ฐ์ด ๊ฐ๋จํ๊ฒ ์๋ฅผ ๋ค ์ ์๋ค.
public void DFS(int n){
if(n==0) return;
else{
DFS(n - 1);
System.out.print(n+" ");
}
}
์ ํจ์ DFS๋ ๋งค๊ฐ๋ณ์ n์์ ๋ถํฐ 1๊น์ง๋ฅผ ์ถ๋ ฅํ๋ ํจ์๋ก, ์๊ธฐ ์์ ์ ๋ค์ ํธ์ถํ์ฌ ์ฌ๊ท์ ์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์๋ค.
๐ก์ฌ๊ท ํจ์์ ์ฅ์ ๊ณผ ๋จ์
์ฌ๊ท ํจ์๋ฅผ ์ด์ฉํ๋ฉด ๋ถํ์ํ๊ฒ ์ฌ๋ฌ ๊ฐ์ ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ์ง ์๊ณ ์ฝ๋๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ์์ฑํ ์ ์์ผ๋ฉฐ, ์์ ์๋ ์ฉ์ดํ๋ค. ๋, ๋ณ์๋ฅผ ์ฌ๋ฌ ๊ฐ ์ฌ์ฉํ ํ์๊ฐ ์๋ค๋ ์ฅ์ ์ด ์๋ค.
ํ์ง๋ง, ๋ฐ๋ณต๋ฌธ๊ณผ ๋ฌ๋ฆฌ ์ฝ๋์ ํ๋ฆ์ ์ง๊ด์ ์ผ๋ก ํ์ ํ๊ธฐ ์ด๋ ต๊ณ , ๋ฐ๋ณตํ์ฌ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ธฐ ๋๋ฌธ์ ์ง์ญ๋ณ์, ๋งค๊ฐ๋ณ์, ๋ฐํ๊ฐ์ ๋ชจ๋ process stack์ ์ ์ฅํ์ฌ ๋ฐ๋ณต๋ฌธ์ ๋นํด ๋ ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค. ๋, ๋ฉ์๋๋ฅผ ํธ์ถํ๊ณ ๋ฉ์๋๊ฐ ์ข ๋ฃ๋ ์ดํ์ ๋ณต๊ท๋ฅผ ์ํ ์ปจํ ์คํธ ์ค์์นญ ๋น์ฉ์ด ๋ฐ์ํ๊ฒ ๋๋ค๋ ๋จ์ ์ด ์๋ค.
๊ทธ๋ ๋ค๋ฉด ์ฌ๊ท ํจ์๋ ์ธ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์๊น?
๐ก์ฌ๊ท ํจ์๋ฅผ ์ด์ฉํ๊ธฐ ์ํ ์กฐ๊ฑด
๋จผ์ ๋ฌธ์ ์ ํฌ๊ธฐ๋ฅผ ์์ ๋จ์๋ก ์ชผ๊ฐค ์ ์๋ ๊ฒฝ์ฐ, ์ฌ๊ท ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ข๋ค. ๋, ์ฌ๊ท ํธ์ถ์ด ์ข ๋ฃ๋๋ ์์ , ์ฆ ์ฌ๊ท ํ์ถ ์์ ์ด ์กด์ฌํด์ผ ํ๋ค.
๊ทธ๋ผ ๋ค์ ์์ ๋ฅผ ํ๋ฒ ๋ณด์.
๐ํฉํ ๋ฆฌ์ผ์ ๋ฐ๋ณต๋ฌธ๊ณผ ์ฌ๊ทํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๊ฐ ๊ตฌํํด๋ณด์.
int n(n์ 0์ด์ ์์)์ ๋งค๊ฐ๋ณ์๋ก ์ ๋ ฅ๋ฐ์ n!=nx(n-1)x(n-2)x.....x1 ์ ๊ฐ์ ๋ฆฌํดํด์ผ ํ๋ค.
์ฐ์ ๋ฐ๋ณต๋ฌธ์ผ๋ก ๊ตฌํํ ์ฝ๋๋ฅผ ๋ณด์.
public int factorial1(int n){
int result=1;
for(int i=1;i<=n;i++){
result=result*i;
}
return result;
}
๋ฐ๋ณต๋ฌธ์ผ๋ก ๊ตฌํํ๋ฉด i๋ฅผ 1~n๊น์ง ์ฆ๊ฐ์์ผ๊ฐ๋ฉด์ n!์ ๊ฒฐ๊ณผ๊ฐ์ ๋ฆฌํดํ ์ ์๋ค.
๊ทธ๋ ๋ค๋ฉด ์ฌ๊ท์ ์ผ๋ก ์ด๋ป๊ฒ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๊น?
์๋ฅผ ๋ค์ด n=5๋ผ ๊ฐ์ ํ๋ฉด 5!=5*4*3*2*1 ์ด๋ค. ํ์ง๋ง 5!์ 5!=5*4!์ผ๋ก๋ ํํ์ด ๊ฐ๋ฅํ๋ค.
5!=5*4!
4!=4*3!
3!=3*2!
2!=2*1!
1!=1*0!
์ฆ, n!=n*(n-1)!์ผ๋ก ๋ํ๋ผ ์ ์๋ค.
๋ฐ๋ผ์ ์ด๋ฅผ ์ด์ฉํ์ฌ ์ฌ๊ท์ ์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์์ฑ๊ฐ๋ฅํ๋ค.
public int factorial2(int n){
if(n<=1) return 1;
else {
return n*factorial2(n-1);
}
}
์ด๋ ๊ฒ ์ฌ๊ทํจ์๋ฅผ ์ด์ฉํ๋ฉด ์ข ๋ ์ฝ๋๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ์์ฑ์ด ๊ฐ๋ฅํ๋ค.
์ผ๋ฐ์ ์ธ ์ฌ๊ท ํจ์์ ํ ํ๋ฆฟ์ ๋ค์๊ณผ ๊ฐ๋ค.
public type recursive(input1, input2, ... ){
//Base Case : ๋ฌธ์ ๋ฅผ ๋ ์ด์ ์ชผ๊ฐค ์ ์๋ ๊ฒฝ์ฐ, ํ์ถ ์์
if(๋ฌธ์ ๋ฅผ ๋ ์ด์ ์ชผ๊ฐค ์ ์๋ ๊ฒฝ์ฐ){
return ๋จ์ํ ๋ฌธ์ ์ ํด๋ต;
}
//recursive Case : ๋ ์์ ๋ฌธ์ ๋ก ์ชผ๊ฐค ์ ์๋ ๊ฒฝ์ฐ
return ๋ ์์ ๋ฌธ์ ๋ก ์๋กญ๊ฒ ์ ์๋ ๋ฌธ์ ;
}
์ถ๊ฐ๋ก ํผ๋ณด๋์น ์์ด ์์ ๋ฅผ ์ดํด๋ณด์.
๐ํผ๋ณด๋์น ์์ด์ ๋ฐ๋ณต๋ฌธ๊ณผ ์ฌ๊ทํจ์, ๋ฉ๋ชจ์ด์ ์ด์ ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๊ฐ ๊ตฌํํด๋ณด์.
int n์ ๋งค๊ฐ๋ณ์๋ก ๋ฐ๊ณ n๊ฐ์ ํผ๋ณด๋์น ์์ด ๋ฆฌํด.
ํผ๋ณด๋์น ์์ด์ 1, 1, 2, 3, 5, 8, 13 .. ์ฒ๋ผ ์ด๋ค ์ n์ด ์์ ๋์ n-1,n-2์ ํฉ์ผ๋ก ํํ๋๋ ๊ฒฝ์ฐ๋ฅผ ๋งํ๋ค.
์ฐ์ ๋ฐ๋ณต๋ฌธ์ผ๋ก ํผ๋ณด๋์น ์์ด์ ๋ํ๋ด๋ณด์.
public int[] fibo1(int n){
int[] arr = new int[n];
arr[0]=1;
arr[1]=1;
for (int i = 2; i < n; i++) {
arr[i] = arr[i - 1] + arr[i - 2];
}
return arr;
}
๋ค์์ ์ฌ๊ทํจ์๋ก ํผ๋ณด๋์น ์์ด์ ๋ํ๋ด๋ณด์.
public int fibo2(int n){
if(n==1 || n==2) return result[n]=1;
return result[n]=fibo2(n-1)+fibo2(n-2);
}
๋ง์ง๋ง์ผ๋ก ๋ฉ๋ชจ์ด์ ์ด์ ์ผ๋ก, ๋ฐ๋ณตํด์ ์ ๊ทผํ๋ ์ฐ์ฐ์ ์ค์ด๋๋ก ์ฝ๋๋ฅผ ์์ฑํด ๋ณด์.
public int fibo3(int n){
if(dp[n]>0) return dp[n];
if(n==1 || n==2) return dp[n]=1;
else return dp[n] = fibo3(n - 1) + fibo3(n - 2);
}
dp๋ฐฐ์ด๋ก ์ด๋ฏธ ์ฐ์ฐํ fibo๋ ๋ค์ ๋ฐฉ๋ฌธํ์ง ์๋๋ก ํ๋ค.
์ ์ฒด ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
package codingTest.inflearn;
import java.util.ArrayList;
import java.util.Arrays;
public class Sol44_2 {
static int[] dp;
static int[] result;
//๋ฐ๋ณต๋ฌธ
public int[] fibo1(int n){
int[] arr = new int[n];
arr[0]=1;
arr[1]=1;
for (int i = 2; i < n; i++) {
arr[i] = arr[i - 1] + arr[i - 2];
}
return arr;
}
//์ฌ๊ท
public int fibo2(int n){
if(n==1 || n==2) return result[n]=1;
return result[n]=fibo2(n-1)+fibo2(n-2);
}
//๋ฉ๋ชจ์ด์ ์ด์
public int fibo3(int n){
if(dp[n]>0) return dp[n];
if(n==1 || n==2) return dp[n]=1;
else return dp[n] = fibo3(n - 1) + fibo3(n - 2);
}
public static void main(String[] args) {
Sol44_2 s = new Sol44_2();
System.out.println("๋ฐ๋ณต๋ฌธ์ผ๋ก ๋ง๋ fibo");
System.out.println(Arrays.toString(s.fibo1(8)));
result = new int[9];
System.out.println("์ฌ๊ทํจ์๋ก ๋ง๋ fibo");
s.fibo2(8);
for(int i=1;i<result.length;i++) System.out.print(result[i]+", ");
System.out.println();
dp = new int[9];
System.out.println("๋ฉ๋ชจ์ด์ ์ด์
์ ํ์ฉํ fibo");
s.fibo3(8);
for(int i=1;i<result.length;i++) System.out.print(result[i]+", ");
}
}
์ด๋ ๋ฏ ์ฌ๊ท๋ ์ฃผ์ด์ง ๋ฌธ์ ๋ฅผ ๋น์ทํ ๊ตฌ์กฐ์ ๋ ์์ ๋ฌธ์ ๋ก ๋๋ ์ ์๋ ๊ฒฝ์ฐ, ๋๋ ์ค์ฒฉ๋ ๋ฐ๋ณต๋ฌธ์ด ๋ง๊ฑฐ๋ ๋ฐ๋ณต๋ฌธ์ ์ค์ฒฉ ํ์๋ฅผ ์์ธกํ๊ธฐ ์ด๋ ค์ด ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ฉด ์ ํฉํ๋ค.

'์๊ณ ๋ฆฌ์ฆ๐' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฌธ์ ํ์ด[ํ.๊ทธ.๋จธ] - ๊ณต์ ์ฐ์ฑ , ๋ฐํํ๋ฉด ์ ๋ฆฌ (0) | 2023.07.04 |
---|---|
๋ฌธ์ ํ์ด[ํ.๊ทธ.๋จธ] - ๋ฌ๋ฆฌ๊ธฐ ๊ฒฝ์ฃผ, ์ถ์ต ์ ์ (0) | 2023.07.03 |
ํ์ ์๊ณ ๋ฆฌ์ฆ(Greedy) (0) | 2023.07.03 |
๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ(๋์ ๊ณํ๋ฒ) (0) | 2023.03.22 |
์ด์ง ํ์ (0) | 2022.08.10 |