์•Œ๊ณ ๋ฆฌ์ฆ˜๐Ÿˆ

์žฌ๊ท€ํ•จ์ˆ˜, ์žฌ๊ท€์  ์‚ฌ๊ณ 

Jeein0313 2023. 3. 15. 13:09

์˜ค๋Š˜์€ ์žฌ๊ท€ํ•จ์ˆ˜์™€ ์žฌ๊ท€์  ์‚ฌ๊ณ ์— ๋Œ€ํ•ด ํฌ์ŠคํŒ…ํ•˜๊ฒ ๋‹ค. ์†”์งํžˆ '์žฌ๊ท€'๋กœ ํ’€์–ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ์—๋Š” ์—ฌ์ „ํžˆ ์•ฝ๊ฐ„? ์ซ„์ง€๋งŒ ๋ฐ˜๋ณต๋งŒ์ด ์‚ด๊ธธ์ด๋‹ค..ใ…‹ใ…‹

 

 

 

๐Ÿ’ก์žฌ๊ท€ ํ•จ์ˆ˜๋ž€ ?

์žฌ๊ท€ ํ•จ์ˆ˜๋ž€, ์ž๊ธฐ ์ž์‹ ์„ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ„๋‹จํ•˜๊ฒŒ ์˜ˆ๋ฅผ ๋“ค ์ˆ˜ ์žˆ๋‹ค.

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]+", ");

    }
}

 

 

์ด๋ ‡๋“ฏ ์žฌ๊ท€๋Š” ์ฃผ์–ด์ง„ ๋ฌธ์ œ๋ฅผ ๋น„์Šทํ•œ ๊ตฌ์กฐ์˜ ๋” ์ž‘์€ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ, ๋˜๋Š” ์ค‘์ฒฉ๋œ ๋ฐ˜๋ณต๋ฌธ์ด ๋งŽ๊ฑฐ๋‚˜ ๋ฐ˜๋ณต๋ฌธ์˜ ์ค‘์ฒฉ ํšŸ์ˆ˜๋ฅผ ์˜ˆ์ธกํ•˜๊ธฐ ์–ด๋ ค์šด ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•˜๋ฉด ์ ํ•ฉํ•˜๋‹ค.