์๋ผํ ์คํ ๋ค์ค์ ์ฒด๋?
์๋ผํ ์คํ ๋ค์ค์ ์ฒด(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)
๋ฐ์ํ
๋๊ธ