10. ์†Œ์ˆ˜์™€ ํ•ฉ์„ฑ์ˆ˜ (Prime and Composite Numbers) Codility Lesson ํ•œ๊ตญ์–ด ์ •๋ฆฌ๋ณธ (JavaScript ver.)

    ์†Œ์ˆ˜(Prime Number)์™€ ํ•ฉ์„ฑ์ˆ˜(Composite Number)

    ์†Œ์ˆ˜(Prime Number) ๋Š” 1๋ณด๋‹ค ํฌ๊ณ , ์ž๊ธฐ ์ž์‹ ๊ณผ 1์„ ์ œ์™ธํ•œ ์•ฝ์ˆ˜๊ฐ€ ์—†๋Š” ์ˆ˜ ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

    ํ•ฉ์„ฑ์ˆ˜(Composite Number) ๋Š” 1๊ณผ ์ž๊ธฐ ์ž์‹  ์ด์™ธ์—๋„ ๋‹ค๋ฅธ ์•ฝ์ˆ˜๋ฅผ ๊ฐ€์ง€๋Š” ์ˆ˜ ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

    ์˜ˆ๋ฅผ ๋“ค์–ด, 2, 3, 5, 7, 11, 13 ๋“ฑ์€ ์†Œ์ˆ˜์ด๋ฉฐ, 4, 6, 8, 9, 10 ๋“ฑ์€ ํ•ฉ์„ฑ์ˆ˜์ด๋‹ค.


    1. O(√n) ์‹œ๊ฐ„ ๋ณต์žก๋„์˜ ์•ฝ์ˆ˜ ๊ฐœ์ˆ˜ ๊ตฌํ•˜๊ธฐ

    n์˜ ์•ฝ์ˆ˜๋ฅผ ์ฐพ๋Š” ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ•์€ 1๋ถ€ํ„ฐ n๊นŒ์ง€ ๋ชจ๋“  ์ˆ˜๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ ์ด๋‹ค. ํ•˜์ง€๋งŒ n์˜ ์•ฝ์ˆ˜๋Š” ๋Œ€์นญ์„ฑ์„ ๊ฐ€์ง€๋ฏ€๋กœ, √n ๊นŒ์ง€๋งŒ ํƒ์ƒ‰ํ•ด๋„ ์ „์ฒด ์•ฝ์ˆ˜๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

    JavaScript ์ฝ”๋“œ:

    function countDivisors(n) {
        let count = 0;
        let i = 1;
        
        while (i * i < n) {
            if (n % i === 0) {
                count += 2; // i์™€ n/i ๋‘ ๊ฐœ์˜ ์•ฝ์ˆ˜ ์ถ”๊ฐ€
            }
            i++;
        }
        
        if (i * i === n) {
            count += 1; // ์ œ๊ณฑ์ˆ˜์ผ ๊ฒฝ์šฐ ์ค‘๋ณต ์ œ๊ฑฐ
        }
        return count;
    }
    

    ์‹œ๊ฐ„ ๋ณต์žก๋„: O(√n)


    2. O(√n) ์‹œ๊ฐ„ ๋ณต์žก๋„์˜ ์†Œ์ˆ˜ ํŒ๋ณ„

    ์†Œ์ˆ˜์ธ์ง€ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•:

    • 2๋ถ€ํ„ฐ n-1๊นŒ์ง€ ๋ชจ๋“  ์ˆซ์ž๋กœ ๋‚˜๋ˆ„์–ด ๋ณด๋ฉด O(n) ์‹œ๊ฐ„์ด ๊ฑธ๋ฆผ.
    • √n๊นŒ์ง€๋งŒ ๊ฒ€์‚ฌํ•˜๋ฉด O(√n)์œผ๋กœ ์ตœ์ ํ™” ๊ฐ€๋Šฅ

    JavaScript ์ฝ”๋“œ:

    function isPrime(n) {
        if (n < 2) return false;
        let i = 2;
        while (i * i <= n) {
            if (n % i === 0) return false;
            i++;
        }
        return true;
    }
    

    ์‹œ๊ฐ„ ๋ณต์žก๋„: O(√n)


    3. ๋™์ „ ๋’ค์ง‘๊ธฐ ๋ฌธ์ œ (Coin Flipping Problem)

    n๊ฐœ์˜ ๋™์ „์ด ์ผ๋ ฌ๋กœ ๋†“์—ฌ ์žˆ๊ณ , ์ดˆ๊ธฐ์—๋Š” ๋ชจ๋‘ ์•ž๋ฉด(Heads)์ด๋‹ค.

    • i๋ฒˆ์งธ ์‚ฌ๋žŒ์ด ๋ฐฐ์ˆ˜ ์œ„์น˜์˜ ๋™์ „์„ ๋’ค์ง‘๋Š”๋‹ค. (์˜ˆ: i = 3์ด๋ฉด 3, 6, 9, ...์„ ๋’ค์ง‘์Œ)
    • ์ตœ์ข…์ ์œผ๋กœ ๋’ท๋ฉด(Tails)์ด ๋ณด์ด๋Š” ๋™์ „์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ.

    O(n log n) ํ•ด๊ฒฐ๋ฒ• (์‹œ๋ฎฌ๋ ˆ์ด์…˜)

    function countTails(n) {
        let result = 0;
        let coin = new Array(n + 1).fill(0);
        
        for (let i = 1; i <= n; i++) {
            let k = i;
            while (k <= n) {
                coin[k] = (coin[k] + 1) % 2;
                k += i;
            }
            result += coin[i];
        }
        return result;
    }
    

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


    O(√n) ํ•ด๊ฒฐ๋ฒ• (์ˆ˜ํ•™์  ์ตœ์ ํ™”)

    ๋’ค์ง‘ํžŒ ํšŸ์ˆ˜๊ฐ€ ํ™€์ˆ˜์ธ ๋™์ „ ๋งŒ ๋’ท๋ฉด์„ ๋ณด์ด๊ฒŒ ๋œ๋‹ค. ์ด๋Š” ์•ฝ์ˆ˜์˜ ๊ฐœ์ˆ˜๊ฐ€ ํ™€์ˆ˜์ธ ๊ฒฝ์šฐ์ธ๋ฐ, ์ œ๊ณฑ์ˆ˜๋งŒ ํ™€์ˆ˜ ๊ฐœ์˜ ์•ฝ์ˆ˜๋ฅผ ๊ฐ€์ง„๋‹ค. ์ฆ‰, 1, 4, 9, 16, ...์˜ ๊ฐœ์ˆ˜๋ฅผ ์ฐพ์œผ๋ฉด ๋œ๋‹ค.

    function countTailsOptimized(n) {
        return Math.floor(Math.sqrt(n));
    }
    

    ์‹œ๊ฐ„ ๋ณต์žก๋„: O(1) (์ œ๊ณฑ๊ทผ ๊ณ„์‚ฐ)

    ๋ฐ˜์‘ํ˜•

    ๋Œ“๊ธ€