13. ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด (Fibonacci Numbers) Codility Lesson ํ•œ๊ตญ์–ด ์ •๋ฆฌ๋ณธ (JavaScript ver.)

    ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด(Fibonacci Numbers)์ด๋ž€?

    ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜๋œ๋‹ค.

    F(0) = 0
    F(1) = 1
    F(n) = F(n-1) + F(n-2) (n ≥ 2)

    ์˜ˆ์ œ:

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

    1. O(2โฟ) ์‹œ๊ฐ„ ๋ณต์žก๋„์˜ ์žฌ๊ท€ ๋ฐฉ์‹ (๋น„ํšจ์œจ์ )

    JavaScript ์ฝ”๋“œ:

    function fibonacci(n) {
        if (n <= 1) return n;
        return fibonacci(n - 1) + fibonacci(n - 2);
    }

    ์ด ๋ฐฉ์‹์€ ๋„ˆ๋ฌด ๋Š๋ ค์„œ n์ด ์ปค์งˆ์ˆ˜๋ก ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.


    2. O(n) ์‹œ๊ฐ„ ๋ณต์žก๋„์˜ ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹

    JavaScript ์ฝ”๋“œ:

    function fibonacciDP(n) {
        let fib = new Array(n + 1).fill(0);
        fib[1] = 1;
        
        for (let i = 2; i <= n; i++) {
            fib[i] = fib[i - 1] + fib[i - 2];
        }
        return fib[n];
    }

    ์ด ๋ฐฉ์‹์€ O(n) ์‹œ๊ฐ„ ๋ณต์žก๋„๋กœ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์„ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค.


    3. O(log n) ์‹œ๊ฐ„ ๋ณต์žก๋„์˜ ํ–‰๋ ฌ ๊ฑฐ๋“ญ์ œ๊ณฑ ๋ฐฉ์‹

    ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์„ ๋” ๋น ๋ฅด๊ฒŒ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ํ–‰๋ ฌ ๊ฑฐ๋“ญ์ œ๊ณฑ ๋ฐฉ์‹ ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

    function fibonacciMatrix(n) {
        if (n === 0) return 0;
        let F = [[1, 1], [1, 0]];
        power(F, n - 1);
        return F[0][0];
    }
    
    function power(F, n) {
        if (n === 0 || n === 1) return;
        let M = [[1, 1], [1, 0]];
        
        power(F, Math.floor(n / 2));
        multiply(F, F);
        
        if (n % 2 !== 0) multiply(F, M);
    }
    
    function multiply(F, M) {
        let x = F[0][0] * M[0][0] + F[0][1] * M[1][0];
        let y = F[0][0] * M[0][1] + F[0][1] * M[1][1];
        let z = F[1][0] * M[0][0] + F[1][1] * M[1][0];
        let w = F[1][0] * M[0][1] + F[1][1] * M[1][1];
        
        F[0][0] = x;
        F[0][1] = y;
        F[1][0] = z;
        F[1][1] = w;
    }

    ์ด ๋ฐฉ๋ฒ•์€ O(log n) ์‹œ๊ฐ„ ๋ณต์žก๋„๋กœ ๋งค์šฐ ํšจ์œจ์ ์ด๋‹ค.

    ๋ฐ˜์‘ํ˜•

    ๋Œ“๊ธ€