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) (์ œ๊ณฑ๊ทผ ๊ณ„์‚ฐ)

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€