GiantStepDEV
article thumbnail

ํ•ด๋‹น ์‹œ๋ฆฌ์ฆˆ๋Š” ์ œ๊ฐ€ ์ฑ…(์‰ฝ๊ฒŒ ๋ฐฐ์šฐ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ with ์ž๋ฐ”)์„ ์ฝ๊ณ  ํ•ด๋‹น ๋‚ด์šฉ์„ ์ •๋ฆฌํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์–ด๋ ต๋‹ค๊ณ  ๋А๊ปด์ง€๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ตœ๋Œ€ํ•œ ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•˜๊ณ ์ž ํ’€์–ด์“ฐ๋Š” ์  ์ฐธ์กฐํ•ด์ฃผ์‹œ๊ณ ,

๊ฐ™์ด ์ž๋ฃŒ๊ตฌ์กฐ/์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ•˜๋Š” ์‹œ๊ฐ„์ด ๋˜์—ˆ์œผ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.


์ž๋ฃŒ๊ตฌ์กฐ์™€ ์žฌ๊ท€

์žฌ๊ท€?

 

์žฌ๊ท€๋Š” ์„ฑ๊ฒฉ์€ ๊ฐ™๊ณ  ํฌ๊ธฐ๋งŒ ์ž‘์€ ๋‚˜๋ฅผ ์ฐพ์•„ ํฐ ๋‚˜์™€ ์ž‘์€ ๋‚˜๊ฐ€ ์—ฐ๊ฒฐ๋œ ๊ด€๊ณ„๋ฅผ ๋“œ๋Ÿฌ๋‚ด๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค.

๋‹จ์–ด๊ฐ€ ์ƒ์†Œํ•˜์—ฌ ๋ฌด์Šจ ์˜๋ฏธ์ธ์ง€ ์ž˜ ์™€๋‹ฟ์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋Š”๋ฐ์š”. (์ œ๊ฐ€ ๊ทธ๋žฌ์Šต๋‹ˆ๋‹ค.)

๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ์˜ˆ์ธ ํŒฉํ† ๋ฆฌ์–ผ(!)๋กœ ์„ค๋ช… ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

 

ํŒฉํ† ๋ฆฌ์–ผ์€ 1๋ถ€ํ„ฐ n๊นŒ์ง€ ๊ณฑํ•˜๋Š” ๊ฒƒ์œผ๋กœ n! = 1 * 2 * 3 * ... * (n - 1) * n ์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๋งจ ๋์— ์žˆ๋Š” n์„ ์ œ์™ธํ•˜๋ฉด 1 * 2 * 3 * ... * (n - 1),  (n - 1)! ์ž…๋‹ˆ๋‹ค.

๋‹ค์‹œ ์ •๋ฆฌํ•˜๋ฉด n! = n * (n - 1)! ์ž…๋‹ˆ๋‹ค. ํ˜น์‹œ ๋ญ”๊ฐ€ ๋А๊ปด์ง€์‹œ๋Š” ๊ฒŒ ์žˆ๋‚˜์š”?

 

์ด์ฒ˜๋Ÿผ ํฌ๊ธฐ๊ฐ€ n์ธ ํŒฉํ† ๋ฆฌ์–ผ ํฌ๊ธฐ๊ฐ€ n - 1์ธ ํŒฉํ† ๋ฆฌ์–ผ์„ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ฒ˜๋Ÿผ ์–ด๋–ค ๋ฌธ์ œ๋‚˜ ํ•จ์ˆ˜ ๋“ฑ์ด ์ž์‹ ๊ณผ ์„ฑ๊ฒฉ์ด ๋˜‘๊ฐ™์ง€๋งŒ ํฌ๊ธฐ๊ฐ€ ๋” ์ž‘์€ ๋ฌธ์ œ๋ฅผ ํ•˜๋‚˜ ์ด์ƒ ํฌํ•จํ•˜๊ณ  ์žˆ์„ ๋•Œ '์žฌ๊ท€์  ๊ตฌ์กฐ'๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค.

 

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ๋Š” ์žฌ๊ท€๋ฅผ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์ž์‹ ์„ ํ˜ธ์ถœํ•˜๋Š” ์ž๊ธฐ ํ˜ธ์ถœ ๊ธฐ๋Šฅ์ด๋ผ๊ณ ๋„ ํ•ฉ๋‹ˆ๋‹ค.

'์žฌ๊ท€'์˜ ์˜๋ฏธ๊ฐ€ ์ง๊ด€์ ์œผ๋กœ ์ž˜ ์™€๋‹ฟ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— '์ž๊ธฐ ํ˜ธ์ถœ'์ด๋ผ๋Š” ๋ง๊ณผ ํ˜ผ์šฉํ•˜์—ฌ ์“ฐ๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


์žฌ๊ท€ ๊ตฌ์กฐ์˜ ์˜ˆ1) ํŒฉํ† ๋ฆฌ์–ผ

 

์•ž์„œ ์„ค๋ช…๋“œ๋ ธ๋˜ ํŒฉํ† ๋ฆฌ์–ผ์„ ์ž๋ฐ” ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

public class Main {
    public static void main(String[] args) {
        System.out.println("3! = " + factorial(3));
    }
    public static int factorial(int n) {
        if(n == 1) {
            return 1;
        } else return n * factorial(n-1);
    }
}

 ์ด๋ ‡๊ฒŒ ์žฌ๊ท€ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์ž๊ธฐ ์ž์‹ ์„ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, ํ•จ์ˆ˜๊ฐ€ ์ˆ˜ํ–‰๋˜๋Š” ๋„์ค‘์— ์ž๊ธฐ ์ž์‹ ์„ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ์‹์ธ๋ฐ์š”.

์ด๋ ‡๊ฒŒ ์ž๊ธฐ ์ž์‹ ์„ ํ˜ธ์ถœํ•˜๋ฉด์„œ ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜๋ณต์ ์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์„ '์žฌ๊ท€ํ˜ธ์ถœ(์ž๊ธฐ ํ˜ธ์ถœ)' ์ด๋ผ๊ณ ํ•ฉ๋‹ˆ๋‹ค.

 

ํŒฉํ† ๋ฆฌ์–ผ ๊ฐ™์ด ๊ฐ„๋‹จํ•œ ๋ฌธ์ œ์˜ ๊ฒฝ์šฐ์—๋Š” ์ž…๋ ฅ๊ฐ’์ด ์ž‘๊ธฐ ๋•Œ๋ฌธ์— for๋ฌธ๊ณผ ์žฌ๊ท€ํ•จ์ˆ˜์˜ ์„ฑ๋Šฅ ์ฐจ์ด๊ฐ€ ํฌ์ง€ ์•Š์ง€๋งŒ, ์ด์ง„ ํƒ์ƒ‰๊ณผ ๊ฐ™์€ ๋ถ„ํ•  ์ •๋ณต ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•œ ๊ตฌํ˜„์ด ๋” ๋น ๋ฆ…๋‹ˆ๋‹ค.


  • ์ด์ง„ ํƒ์ƒ‰ : ์ •๋ ฌ๋œ ๋ฐฐ์—ด์—์„œ ํŠน์ • ๊ฐ’์„ ์ฐพ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜
    ๋ฐฐ์—ด์˜ ์ค‘๊ฐ„๊ฐ’๊ณผ ์ฐพ๊ณ ์ž ํ•˜๋Š” ๊ฐ’์˜ ํฌ๊ธฐ๋ฅผ ๋น„๊ตํ•˜์—ฌ ํƒ์ƒ‰ ๋ฒ”์œ„๋ฅผ ๋ฐ˜์œผ๋กœ ์ค„์—ฌ๊ฐ€๋ฉฐ ๊ฐ’์„ ์ฐพ์Œ.
  • ๋ถ„ํ•  ์ •๋ณต : ํฐ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ„์–ด ํ•ด๊ฒฐํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜
    ํฐ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ถ€๋ถ„ ๋ฌธ์ œ๋กœ ๋ถ„ํ• ํ•œ ํ›„, ๋ถ€๋ถ„ ๋ฌธ์ œ๋ฅผ ๊ฐ๊ฐ ํ•ด๊ฒฐํ•˜๊ณ , ๊ฐ ๋ถ€๋ถ„ ๋ฌธ์ œ์˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ๊ฒฐํ•ฉํ•˜์—ฌ ์ „์ฒด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•(๋ณ‘ํ•ฉ ์ •๋ ฌ, ํ€ต ์ •๋ ฌ, ์ด์ง„ ํƒ์ƒ‰ ๋“ฑ)

์žฌ๊ท€ ๊ตฌ์กฐ์˜ ์˜ˆ2) ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด

 

ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์€ ์ด์ „ ๋‘ ํ•ญ์˜ ํ•ฉ์ด ๋‹ค์Œ ํ•ญ์ด ๋˜๋Š” ์ˆ˜์—ด ์ž…๋‹ˆ๋‹ค.

์ฆ‰, 0๊ณผ 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‚˜์—ด๋ฉ๋‹ˆ๋‹ค.

 

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ...

 

์ด ์ˆ˜์—ด์„ ์žฌ๊ท€ ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„ํ•ด๋ณผ๊นŒ์š”?

public static int fibonacci(int n) {
    if (n == 0) { // ์ข…๋ฃŒ ์กฐ๊ฑด 1
        return 0;
    } else if (n == 1) { // ์ข…๋ฃŒ ์กฐ๊ฑด 2
        return 1;
    } else { // ์žฌ๊ท€ ํ˜ธ์ถœ
        return fibonacci(n-1) + fibonacci(n-2);
    }
}

์œ„ ์ฝ”๋“œ์—์„œ fibonacci()๋Š” n๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

n์ด 0์ด๋‚˜ 1์ผ ๋•Œ๋Š” ๊ฐ๊ฐ 0, 1์„ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ์—๋Š” ์ด์ „ ๋‘ ํ•ญ์˜ ํ•ฉ์„ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•ด ์ž๊ธฐ ์ž์‹ ์„ ๋‘ ๋ฒˆ ํ˜ธ์ถœํ•˜์—ฌ ์žฌ๊ท€์ ์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

 

์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์•„์‹œ๋‹ค์‹œํ”ผ ์žฌ๊ท€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ฐ˜๋ณตํ•ด์„œ ํ˜ธ์ถœํ•˜๋‹ค๊ฐ€ ์–ธ์  ๊ฐ€ ๋๋‚˜์•ผ ํ•˜๋Š”๋ฐ ์ด๋ฅผ ์œ„ํ•œ ๊ฒฝ๊ณ„ ์กฐ๊ฑด์„ ํ•ญ์ƒ ๊ฐ–๊ณ  ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

ํŒฉํ† ๋ฆฌ์–ผ ํ•จ์ˆ˜๋Š” if(n == 1)์ด ๊ฒฝ๊ณ„ ์กฐ๊ฑด์ด๊ณ , ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์€ if(n == 0)๊ณผ if(n == 1) ์ž…๋‹ˆ๋‹ค.


์œ ์˜ํ•  ์ 

 

์œ„์˜ fibonacci()๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด ์„ค๋ช…ํ•˜์ž๋ฉด.. ์žฌ๊ท€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ณ  ํฐ ๊ฐ’์„ ๊ตฌํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๊ฐ€ ๋ฐœ์ƒ๋ฉ๋‹ˆ๋‹ค.

์•„๋งˆfibonacci(100)์„ ๊ณ„์‚ฐํ•˜๋ ค๋ฉด ํ‰์ƒ ๊ธฐ๋‹ค๋ ค๋„ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ˆ˜ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

๊ทธ ์ด์œ ๋Š” ๋ญ˜๊นŒ์š”?

๋ฐ”๋กœ ์žฌ๊ท€ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ ํšŸ์ˆ˜๊ฐ€ ์ž…๋ ฅ ํฌ๊ธฐ์— ๋”ฐ๋ผ ์ง€์ˆ˜์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๊ธฐ ๋•Œ๋ฌธ ์ž…๋‹ˆ๋‹ค.

n๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์žฌ๊ท€ ํ˜ธ์ถœ์ด 2^(n-1)๋ฒˆ์ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ์ž…๋ ฅ ํฌ๊ธฐ๊ฐ€ ์ปค์งˆ ์ˆ˜๋ก ์žฌ๊ท€ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ ํšŸ์ˆ˜๋Š” ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

์ด๋Ÿฌํ•œ ์ง€์ˆ˜ํ•จ์ˆ˜์ ์ธ ์ฆ๊ฐ€๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋น„ํšจ์œจ์ ์ด๋ฉฐ, ์ž…๋ ฅ ํฌ๊ธฐ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ์‹คํ–‰์‹œ๊ฐ„์ด ๊ธ‰๊ฒฉํžˆ ์ฆ๊ฐ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์„ค๊ณ„ํ•  ๋•Œ๋Š” ๊ฐ€๋Šฅํ•œ ์ง€์ˆ˜ ํ•จ์ˆ˜์ ์ธ ํ˜ธ์ถœ ํšŸ์ˆ˜๋ฅผ ์ตœ์†Œํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

๊ฐœ์„  ๋ฐฉ์•ˆ(?)

 

ํ•ด๋‹น ์ฝ”๋“œ๊ฐ€ ๋น„ํšจ์œจ์ ์ธ ๊ฑธ ์•Œ์•˜์œผ๋ฉด ๊ฐœ์„  ์ฝ”๋“œ๋„ ์•Œ์•„๋ด์•ผ๊ฒ ์ฃ !

public static int fibonacci(int n) {
    if (n < 2) {
        return n;
    }
    int[] fib = new int[n+1];
    fib[0] = 0;
    fib[1] = 1;
    for (int i = 2; i <= n; i++) {
        fib[i] = fib[i-1] + fib[i-2];
    }
    return fib[n];
}

์ด ์ฝ”๋“œ์—์„œ๋Š” fib[]๋ฅผ ์ด์šฉํ•˜์—ฌ ์ค‘๋ณต๋˜๋Š” ๊ณ„์‚ฐ์„ ์ตœ์†Œํ™” ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  1. ์ž…๋ ฅ ๊ฐ’ n์— ๋”ฐ๋ผ fib[]์„ ์ƒ์„ฑํ•˜๊ณ , ๋ฐฐ์—ด์˜ ์ฒซ ๋ฒˆ์งธ ๊ฐ’๊ณผ ๋‘ ๋ฒˆ์งธ ๊ฐ’์— ๊ฐ๊ฐ 0๊ณผ 1์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  2. 2 ๋ถ€ํ„ฐ n ๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ, ์ด์ „ ๋‘ ๊ฐœ์˜ ๊ฐ’์„ ๋”ํ•œ ๊ฐ’์„ ํ˜„์žฌ์˜ ๊ฐ’์œผ๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  3. fib[n] ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜์—ฌ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์˜ n๋ฒˆ์งธ ๊ฐ’์„ ๊ณ„์‚ฐ ํ•ฉ๋‹ˆ๋‹ค.

์ด ์ฝ”๋“œ๋Š” ์ž…๋ ฅ๊ฐ’์— ๋”ฐ๋ผ ์„ ํ˜•์ ์ธ ์‹คํ–‰ ์‹œ๊ฐ„์„ ๊ฐ€์ง€๋ฏ€๋กœ ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ํšจ์œจ์  ์ž…๋‹ˆ๋‹ค.

์•„๊นŒ ์ฝ”๋“œ๋กœ๋Š” fibonacci(100)์„ ์‹คํ–‰ํ•˜๋ฉด ํ‰์ƒ ๊ฑธ๋ ค๋„ ๊ฒฐ๊ณผ๊ฐ’์„ ๋ชป๋ดค๋‹ค๋ฉด ์ด ์ฝ”๋“œ๋กœ๋Š” ์ฒœ๋งŒ ๋ถ„์˜ 1์ดˆ๋„ ๊ฑธ๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


profile

GiantStepDEV

@kongmi

ํฌ์ŠคํŒ…์ด ์ข‹์•˜๋‹ค๋ฉด "์ข‹์•„์š”โค๏ธ" ๋˜๋Š” "๊ตฌ๋…๐Ÿ‘๐Ÿป" ํ•ด์ฃผ์„ธ์š”!