3. ์‹œ๊ฐ„ ๋ณต์žก๋„ (Time Complexity) Codility Lesson ํ•œ๊ตญ์–ด ์ •๋ฆฌ๋ณธ (JavaScript ver.)

    ์‹œ๊ฐ„ ๋ณต์žก๋„๋ž€?

    ์‹œ๊ฐ„ ๋ณต์žก๋„(Time Complexity)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰ ์‹œ๊ฐ„์„ ๋Œ€๋žต์ ์œผ๋กœ ์ถ”์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ •ํ™•ํ•œ ์‹คํ–‰ ์‹œ๊ฐ„์„ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์€ ์ปดํŒŒ์ผ๋Ÿฌ, ์ปดํ“จํ„ฐ์˜ ์ข…๋ฅ˜, ํ”„๋กœ์„ธ์„œ ์†๋„ ๋“ฑ ์—ฌ๋Ÿฌ ์š”์ธ์— ์˜ํ•ด ์˜ํ–ฅ์„ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ๋ณต์žกํ•˜๋‹ค. ๋”ฐ๋ผ์„œ, ์šฐ๋ฆฌ๋Š” ์‹คํ–‰ ์‹œ๊ฐ„์˜ ๋Œ€๋žต์ ์ธ ํฌ๊ธฐ(order of magnitude) ๋ฅผ ์ธก์ •ํ•˜๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์ด๋‹ค.

    ๋ณต์žก๋„๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ณธ ์—ฐ์‚ฐ(primitive operation) ์˜ ์ตœ๋Œ€ ๊ฐœ์ˆ˜๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๊ธฐ๋ณธ ์—ฐ์‚ฐ์ด๋ž€ ๋ง์…ˆ, ๊ณฑ์…ˆ, ๋Œ€์ž… ์—ฐ์‚ฐ ๋“ฑ์„ ์˜๋ฏธํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๋ชจ๋“  ์—ฐ์‚ฐ์„ ๋‹ค ๊ณ ๋ คํ•˜๋Š” ๋Œ€์‹ , ํ”„๋กœ๊ทธ๋žจ์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‹คํ–‰๋˜๋Š” ์ง€๋ฐฐ์ ์ธ ์—ฐ์‚ฐ(dominant operation) ์— ์ดˆ์ ์„ ๋งž์ถ˜๋‹ค.

    ํ”„๋กœ๊ทธ๋žจ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋ฉฐ, ๋ณดํ†ต ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ์— ์˜ํ•ด ๊ฒฐ์ •๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ž…๋ ฅ์ด ๐‘ ๊ฐœ์˜ ์š”์†Œ๋ฅผ ๊ฐ€์ง„ ๋ฐฐ์—ด์ด๋ผ๋ฉด, ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰ ์‹œ๊ฐ„์€ ๐‘์— ์˜ํ•ด ์ขŒ์šฐ๋  ๊ฒƒ์ด๋‹ค.


    1. ์ง€๋ฐฐ์ ์ธ ์—ฐ์‚ฐ๊ณผ ์‹œ๊ฐ„ ๋ณต์žก๋„

    ๋‹ค์Œ ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด์ž.

    ์˜ˆ์ œ: O(n) (์„ ํ˜• ์‹œ๊ฐ„ ๋ณต์žก๋„)

    function dominant(n) {
        let result = 0;
        for (let i = 0; i < n; i++) {
            result += 1;
        }
        return result;
    }

    ์œ„ ์ฝ”๋“œ์—์„œ result += 1; ์—ฐ์‚ฐ์ด n ๋ฒˆ ์‹คํ–‰๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ํ•จ์ˆ˜์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(n) (์„ ํ˜• ์‹œ๊ฐ„)์ด๋‹ค.

    ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” Big-O ํ‘œ๊ธฐ๋ฒ•์—์„œ ์ƒ์ˆ˜ ๊ณ„์ˆ˜(constant factor) ๋Š” ๋ฌด์‹œ๋œ๋‹ค. ์ฆ‰, ๋ฃจํ”„๊ฐ€ 20 * n ๋ฒˆ ์‹คํ–‰๋˜๋“ , n / 5 ๋ฒˆ ์‹คํ–‰๋˜๋“ , ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” ์—ฌ์ „ํžˆ O(n)์œผ๋กœ ๋ณธ๋‹ค.


    2. ๋‹ค์–‘ํ•œ ์‹œ๊ฐ„ ๋ณต์žก๋„ ๋น„๊ต

    O(1) (์ƒ์ˆ˜ ์‹œ๊ฐ„ ๋ณต์žก๋„)

    function constant(n) {
        return n * n;
    }

    ์ด ํ•จ์ˆ˜๋Š” ํ•ญ์ƒ ์ผ์ •ํ•œ ์ˆ˜์˜ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋ฏ€๋กœ O(1) (์ƒ์ˆ˜ ์‹œ๊ฐ„)์ด๋‹ค.

    O(log n) (๋กœ๊ทธ ์‹œ๊ฐ„ ๋ณต์žก๋„)

    function logarithmic(n) {
        let result = 0;
        while (n > 1) {
            n = Math.floor(n / 2);
            result += 1;
        }
        return result;
    }

    ์ด ํ•จ์ˆ˜๋Š” n์„ ๋ฐ˜๋ณต์ ์œผ๋กœ 2๋กœ ๋‚˜๋ˆ„๋ฏ€๋กœ O(log n) (๋กœ๊ทธ ์‹œ๊ฐ„)์ด๋‹ค.

    O(n) (์„ ํ˜• ์‹œ๊ฐ„ ๋ณต์žก๋„)

    function linear(n, A) {
        for (let i = 0; i < n; i++) {
            if (A[i] === 0) return 0;
        }
        return 1;
    }

    ์ตœ์•…์˜ ๊ฒฝ์šฐ n ๋ฒˆ ๋ฃจํ”„๋ฅผ ์‹คํ–‰ํ•˜๋ฏ€๋กœ O(n) (์„ ํ˜• ์‹œ๊ฐ„)์ด๋‹ค.

    O(n²) (์ด์ฐจ ์‹œ๊ฐ„ ๋ณต์žก๋„)

    function quadratic(n) {
        let result = 0;
        for (let i = 0; i < n; i++) {
            for (let j = i; j < n; j++) {
                result += 1;
            }
        }
        return result;
    }

    ์ด์ค‘ ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ O(n²) (์ด์ฐจ ์‹œ๊ฐ„) ๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š”๋‹ค.

    O(n + m) (๋‹ค์ค‘ ์„ ํ˜• ์‹œ๊ฐ„ ๋ณต์žก๋„)

    function linear2(n, m) {
        let result = 0;
        for (let i = 0; i < n; i++) {
            result += i;
        }
        for (let j = 0; j < m; j++) {
            result += j;
        }
        return result;
    }

    ์—ฌ๊ธฐ์„œ๋Š” n๊ณผ m์— ๋”ฐ๋ผ ๋…๋ฆฝ์ ์ธ ๋‘ ๊ฐœ์˜ ๋ฃจํ”„๊ฐ€ ์‹คํ–‰๋˜๋ฏ€๋กœ O(n + m) ์ด๋‹ค.

    O(2โฟ) (์ง€์ˆ˜ ์‹œ๊ฐ„ ๋ณต์žก๋„) ๋ฐ O(n!) (ํŒฉํ† ๋ฆฌ์–ผ ์‹œ๊ฐ„ ๋ณต์žก๋„)

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


    3. ์‹œ๊ฐ„ ์ œํ•œ๊ณผ ์˜ˆ์ƒ ๋ณต์žก๋„

    ์ผ๋ฐ˜์ ์œผ๋กœ ํ‰๊ท ์ ์ธ ์ปดํ“จํ„ฐ๋Š” 1์ดˆ ์•ˆ์— ์•ฝ 10โธ ๊ฐœ์˜ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ž…๋ ฅ ํฌ๊ธฐ(๐‘›)์— ๋”ฐ๋ฅธ ์˜ˆ์ƒ ๋ณต์žก๋„๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ๋‹ค.

    • ๐‘› ≈ 1,000,000 → O(n) ๋˜๋Š” O(n log n)
    • ๐‘› ≈ 10,000 → O(n²)
    • ๐‘› ≈ 500 → O(n³)

    ์ด๋Š” ๋Œ€๋žต์ ์ธ ๊ธฐ์ค€์ด๋ฉฐ, ํŠน์ • ๋ฌธ์ œ์— ๋”ฐ๋ผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค.


    4. ๊ณต๊ฐ„ ๋ณต์žก๋„ (Space Complexity)

    ๊ณต๊ฐ„ ๋ณต์žก๋„๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋  ๋•Œ ํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

    • O(1) (์ƒ์ˆ˜ ๊ณต๊ฐ„): ๊ณ ์ •๋œ ๊ฐœ์ˆ˜์˜ ๋ณ€์ˆ˜๋งŒ ์‚ฌ์šฉํ•  ๋•Œ
    • O(n) (์„ ํ˜• ๊ณต๊ฐ„): ์ž…๋ ฅ ํฌ๊ธฐ ๐‘› ์— ๋น„๋ก€ํ•˜๋Š” ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•  ๋•Œ
    • O(n²) (์ด์ฐจ ๊ณต๊ฐ„): ๐‘›×๐‘› ํฌ๊ธฐ์˜ 2์ฐจ์› ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•  ๋•Œ

    ํŠนํžˆ ์žฌ๊ท€(Recursion) ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ถ”๊ฐ€์ ์œผ๋กœ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ณต๊ฐ„ ๋ณต์žก๋„๋ฅผ ์‹ ์ค‘ํžˆ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.


    5. ์‹œ๊ฐ„ ๋ณต์žก๋„ ๊ณ„์‚ฐ ์˜ˆ์ œ

    ๋ฌธ์ œ: 1๋ถ€ํ„ฐ ๐‘›๊นŒ์ง€์˜ ํ•ฉ ๊ณ„์‚ฐํ•˜๊ธฐ

    O(n²) (๋น„ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•)

    function slowSum(n) {
        let result = 0;
        for (let i = 0; i < n; i++) {
            for (let j = 0; j <= i; j++) {
                result += 1;
            }
        }
        return result;
    }

    O(n) (์„ ํ˜• ์‹œ๊ฐ„)

    function fastSum(n) {
        let result = 0;
        for (let i = 1; i <= n; i++) {
            result += i;
        }
        return result;
    }

    O(1) (์ƒ์ˆ˜ ์‹œ๊ฐ„, ์ตœ์ ํ™”๋œ ๋ฐฉ๋ฒ•)

    function optimizedSum(n) {
        return (n * (n + 1)) / 2;
    }

    ์ด ๋ฐฉ๋ฒ•์€ ๋‹จ ํ•˜๋‚˜์˜ ์—ฐ์‚ฐ๋งŒ ํ•„์š”ํ•˜๋ฏ€๋กœ O(1) (์ƒ์ˆ˜ ์‹œ๊ฐ„)์ด๋‹ค.

    ๋ฐ˜์‘ํ˜•

    ๋Œ“๊ธ€