Coding Test/Codility

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

chamroro 2025. 3. 2. 16:22

ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด(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) ์‹œ๊ฐ„ ๋ณต์žก๋„๋กœ ๋งค์šฐ ํšจ์œจ์ ์ด๋‹ค.

๋ฐ˜์‘ํ˜•