기존 작성한 알고리즘에서 최적화가 되지 않아 시간이 더 걸리는 문제를 발견했고 이를 수정합니다.
function primeNumberSieve(n) {
const area = new Array(n + 1).fill(false);
const result = [];
// i <= n to i*i <= n
// 주어진 합성수 n은 a*b의 형태로 존재하는데,
// 이때 a와 b 중 하나는 반드시 n^(1/2)이하이다.
for (let i = 2; i*i <= n; i++) {
if (area[i]) continue;
// i*2 to i*i
// i*2~i*(i-1)까지는 이미 지워졌기 때문이다.
for (let j = i * i; j <= n; j += i) {
area[j] = true;
}
}
area.forEach((flag, index) => {
if (index > 1 && !flag) {
result.push(index);
}
});
return result;
}
const result = primeNumberSieve(10);
console.log(result);
// [2, 3, 5, 7]
console.time()과 console.timeEnd()를 이용해 간단하게 시간을 계산해 본 결과 최적화가 된 것으로 확인할 수 있습니다.
- primeNumberSieve(100)
- 기존: 0.080078125 ms
- 최적화: 0.072021484375 ms
- primeNumberSieve(10000)
- 기존: 0.821044921875 ms
- 최적화: 0.741943359375 ms
- primeNumberSieve(100000)
- 기존: 4.073974609375 ms
- 최적화: 3.486083984375 ms
'알고리즘&코테' 카테고리의 다른 글
| [자료구조] Deque with JS (0) | 2025.05.09 |
|---|---|
| [코테 꿀팁] 시간 초과 발생 시 console.log 줄이기 (0) | 2025.04.29 |
| [코테 꿀팁] 배열의 원소 찾기에서 시간 초과가 나온다면? Set.has() 생각하기 (1) | 2025.04.14 |
| [코테 꿀팁] JS 코딩 테스트 (0) | 2025.03.20 |
| [백준] 티어가 어떻게 되는거여? (0) | 2025.02.27 |