
에라토스테네스의 체(Sieve of Eratosthenes)는 고대 그리스의 수학자 에라토스테네스가 고안한 소수를 구하는 알고리즘이다.
※ 소수 : 1과 자기 자신만을 약수로 가지는 자연수 ex. 2, 3, 5, 7
| 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|
| 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 |
| 2 | 3 | 5 | ||
|---|---|---|---|---|
| 7 | 9 | 11 | ||
| 13 | 15 | |||
| 17 | 19 | 21 |
| 2 | 3 | 5 | ||
|---|---|---|---|---|
| 7 | 11 | |||
| 13 | ||||
| 17 | 19 |
2, 3, 5, 7, 11, 13, 17, 19 는 모두 소수이다.function sieveOfEratosthenes(n) {
// 2~n까지의 모든 숫자를 소수(true)로 초기화
const isPrime = Array(n + 1).fill(true).fill(false,0,2);
for (let i = 2; i <= n; i++) {
if (isPrime[i]) {
// i의 배수는 소수가 아니므로 false로 변경
for (let j = i * i; j <= n; j += i) {
isPrime[j] = false;
}
}
}
return isPrime
.map((prime, index) => (prime ? index : null))
.filter(Number.isInteger);
}
console.log(sieveOfEratosthenes(20));
// 출력: [2, 3, 5, 7, 11, 13, 17, 19]
O(n * log(log n))O(n)에라토스테네스의 체는 N보다 작거나 같은 모든 소수를 찾는 유명한 알고리즘이다.
이 알고리즘은 다음과 같다.
N, K가 주어졌을 때, K번째 지우는 수를 구하는 프로그램을 작성하시오.
첫째 줄에 N과 K가 주어진다. (1 ≤ K < N, max(1, K) < N ≤ 1000)
첫째 줄에 K번째 지워진 수를 출력한다.
const fs = require('fs');
const input = fs.readFileSync('dev/stdin').toString().trim();
const [N, K] = input.split(' ').map(Number);
let count = 0;
const isPrime = Array(N + 1)
.fill(true)
.fill(false, 0, 2);
outer: for (let i = 2; i <= N; i++) {
if (isPrime[i]) {
for (let j = i; j <= N; j += i) {
if (!isPrime[j]) continue; // 이미 지운 숫자는 건너뜀
isPrime[j] = false;
count += 1;
if (count === K) {
console.log(j);
break outer;
}
}
}
}
// 입력
10 7
// 출력
9
안녕하세요 :)