11. ์—๋ผํ† ์Šคํ…Œ๋„ค์Šค์˜ ์ฒด (Sieve of Eratosthenes) Codility Lesson ํ•œ๊ตญ์–ด ์ •๋ฆฌ๋ณธ (JavaScript ver.)

    ์—๋ผํ† ์Šคํ…Œ๋„ค์Šค์˜ ์ฒด๋ž€?

    ์—๋ผํ† ์Šคํ…Œ๋„ค์Šค์˜ ์ฒด(Sieve of Eratosthenes) ๋Š” ์ฃผ์–ด์ง„ ๋ฒ”์œ„ ๋‚ด์—์„œ ๋ชจ๋“  ์†Œ์ˆ˜๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฐพ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ์†Œ์ˆ˜๋ฅผ ๊ฑธ๋Ÿฌ๋‚ด๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜๋ฉฐ, O(n log log n) ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค.


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

    JavaScript ์ฝ”๋“œ:

    function sieve(n) {
        let sieve = new Array(n + 1).fill(true);
        sieve[0] = sieve[1] = false;
        
        for (let i = 2; i * i <= n; i++) {
            if (sieve[i]) {
                for (let k = i * i; k <= n; k += i) {
                    sieve[k] = false;
                }
            }
        }
        return sieve;
    }

    ์ด ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด n ์ดํ•˜์˜ ๋ชจ๋“  ์†Œ์ˆ˜๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.


    2. ์†Œ์ธ์ˆ˜ ๋ถ„ํ•ด (Factorization)

    ์†Œ์ธ์ˆ˜ ๋ถ„ํ•ด๋Š” ์ •์ˆ˜๋ฅผ ์†Œ์ˆ˜์˜ ๊ณฑ์œผ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ณผ์ • ์ด๋‹ค.

    JavaScript ์ฝ”๋“œ:

    function sieve(n) {
      // n๊นŒ์ง€์˜ ๋ชจ๋“  ์ˆ˜์— ๋Œ€ํ•ด, spf[i]๋ฅผ i๋กœ ์ดˆ๊ธฐํ™”
      const spf = new Array(n + 1);
      for (let i = 0; i <= n; i++) {
        spf[i] = i;
      }
      
      // 0๊ณผ 1์€ ์†Œ์ˆ˜๊ฐ€ ์•„๋‹˜
      spf[0] = 0;
      spf[1] = 1;
      
      // 2๋ถ€ํ„ฐ √n ๊นŒ์ง€์˜ ์ˆ˜์— ๋Œ€ํ•ด ์ตœ์†Œ ์†Œ์ธ์ˆ˜๋ฅผ ์—…๋ฐ์ดํŠธ
      for (let i = 2; i * i <= n; i++) {
        if (spf[i] === i) { // i๊ฐ€ ์†Œ์ˆ˜๋ผ๋ฉด
          for (let j = i * i; j <= n; j += i) {
            // ์•„์ง j์˜ ์ตœ์†Œ ์†Œ์ธ์ˆ˜๊ฐ€ ๊ฒฐ์ •๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด, i๋กœ ์„ค์ •
            if (spf[j] === j) {
              spf[j] = i;
            }
          }
        }
      }
      
      return spf;
    }
    
    function factorization(x) {
      // x์— ๋Œ€ํ•œ SPF ๋ฐฐ์—ด ์ƒ์„ฑ
      const spf = sieve(x);
      const factors = [];
      
      // x๊ฐ€ 1์ด ๋  ๋•Œ๊นŒ์ง€ ์†Œ์ธ์ˆ˜๋กœ ๋‚˜๋ˆ„๊ธฐ
      while (x !== 1) {
        factors.push(spf[x]);
        x = Math.floor(x / spf[x]);
      }
      
      return factors;
    }
    
    // ์˜ˆ์‹œ
    console.log(factorization(24)); // ์ถœ๋ ฅ: [2, 2, 2, 3] (24 = 2 * 2 * 2 * 3)
    console.log(factorization(60)); // ์ถœ๋ ฅ: [2, 2, 3, 5] (60 = 2 * 2 * 3 * 5)

    ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด O(log x) ์‹œ๊ฐ„ ๋ณต์žก๋„๋กœ ์†Œ์ธ์ˆ˜ ๋ถ„ํ•ด๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

     

    ์†Œ์ˆ˜๋งŒ ์ถœ๋ ฅํ•˜๋ ค๋ฉด ์•„๋ž˜ ์ฝ”๋“œ

    function sieve(n) {
      const spf = new Array(n + 1);
      for (let i = 0; i <= n; i++) {
        spf[i] = i;
      }
      spf[0] = 0;
      spf[1] = 1;
      for (let i = 2; i * i <= n; i++) {
        if (spf[i] === i) { // i๊ฐ€ ์†Œ์ˆ˜์ด๋ฉด
          for (let j = i * i; j <= n; j += i) {
            if (spf[j] === j) {
              spf[j] = i;
            }
          }
        }
      }
      return spf;
    }
    
    function factorization(x) {
      const spf = sieve(x);
      const factorsSet = new Set(); // ์ค‘๋ณต ์ œ๊ฑฐ๋ฅผ ์œ„ํ•œ Set ์‚ฌ์šฉ
      while (x !== 1) {
        factorsSet.add(spf[x]);
        x = Math.floor(x / spf[x]);
      }
      return Array.from(factorsSet);
    }
    
    // ์˜ˆ์ œ ํ…Œ์ŠคํŠธ
    console.log(factorization(24)); // ์ถœ๋ ฅ: [2, 3] (24 = 2*2*2*3)
    console.log(factorization(60)); // ์ถœ๋ ฅ: [2, 3, 5] (60 = 2*2*3*5)

     

    ๋ฐ˜์‘ํ˜•

    ๋Œ“๊ธ€