728x90
문제
- 골드바흐의 추측: 2보다 큰 짝수는 두 소수의 합으로 나타낼 수 있다.
짝수 N을 두 소수의 합으로 나타내는 표현을 골드바흐 파티션이라고 한다. 짝수 N이 주어졌을 때, 골드바흐 파티션의 개수를 구해보자. 두 소수의 순서만 다른 것은 같은 파티션이다.
입력
첫째 줄에 테스트 케이스의 개수 T (1 ≤ T ≤ 100)가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 정수 N은 짝수이고, 2 < N ≤ 1,000,000을 만족한다.
출력
각각의 테스트 케이스마다 골드바흐 파티션의 수를 출력한다.
예제 입력 1
5
6
8
10
12
100
예제 출력 1
1
1
2
1
6
풀이
입력 예제 중 가장 큰 수를 받아서 그 수까지의 수열을 담는 배열을 만든다.
let maxnum = Math.max(...input);
let check = new Array(maxnum + 1).fill(false);
그 후에 그 배열에서 에라토스테네스의 체를 사용해서 소수를 찾아준다.
for (let i = 2; i <= maxnum; i++) {
if (!check[i]) {
for (let j = i * i; j <= maxnum; j += i) {
check[j] = true;
}
}
}
그 후에 해당 값을 하나씩 루프문을 돌며 경우의 수를 찾아준다.
전체코드
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const fs = require("fs"); | |
let input = (process.platform === "linux" | |
? fs.readFileSync("/dev/stdin").toString().trim() | |
: `5 | |
4 | |
6 | |
8 | |
10 | |
12 | |
100` | |
) | |
.split("\n") | |
.map((x) => +x); | |
input.shift(); | |
let maxnum = Math.max(...input); | |
let check = new Array(maxnum + 1).fill(false); | |
for (let i = 2; i <= maxnum; i++) { | |
if (!check[i]) { | |
for (let j = i * i; j <= maxnum; j += i) { | |
check[j] = true; | |
} | |
} | |
} | |
let result = []; | |
input.map((x) => { | |
let tmp = 0; | |
let y = Math.ceil(x / 2); | |
if (x === 4) tmp = 1; | |
else { | |
for (let i = 3; i <= y; i += 2) { | |
if (!check[i] && !check[x - i] && x - i != 1) { | |
tmp++; | |
} | |
} | |
} | |
result.push(tmp); | |
}); | |
console.log(result.join("\n")); |
반응형
'개발👩💻 > 알고리즘' 카테고리의 다른 글
프로그래머스 JS: 스택/큐 기능개발 (0) | 2021.11.28 |
---|---|
백준 js 11653: 소인수분해 (0) | 2021.06.27 |
백준 js 2089: -2진수 (0) | 2021.05.09 |
백준 js 1212: 8진수 2진수 (0) | 2021.05.08 |
백준 js 1373: 2진수 8진수 (0) | 2021.05.08 |