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)

 

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€