let arr = Array(max + 1)
.fill(true)
.fill(false, 0, 2);
for (let i = 2; i * i <= max; i++) {
if (arr[i]) {
for (let j = i * i; j <= max; j += i) {
arr[j] = false;
}
}
}
return arr;
}
const solution = (input) => {
let result = [];
let max = Math.max(...input);
let primeNums = getPrime(max);
for (let k = 0; k < input.length; k++) {
let splitted = input[k];
let count = 0;
for (let n = 1; n <= splitted / 2; n++) {
if (primeNums[splitted - n] && primeNums[n]) {
count++;
}
}
result.push(count);
}
return result.join("\n");
};
/* readline Module */
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
let input = [];
rl.on("line", function (line) {
// input = line; // 입력받은 문자열, line
// input = parseInt(line); // 형변환, parseInt
// rl.close(); // 입력 종료
input.push(line.split("\n").map((el) => parseInt(el)));
// input.push(line);
}).on("close", function () {
const [N] = input.shift();
console.log(solution(input.flat()));
process.exit(); // 프로세스 종료
});
처음 접근 방법
주어진 숫자 - 소수 = 소수 ---> count ++
위의 소수는 에라토스테네스의 채로 만들어진 소수 배열에서 가져온다.
위에서는 덧셈으로 판별했는데, 위의 로직대로 뺄샘으로 해도 될 것 같다.
뺄셈 연산을 계속 해줘야하는 단점이 있다.
위의 코드대로라면 true/false로 처리해도 처리가 가능할 것이다.