function solution(nums) {
let sums = [];
// 세수의 합을 구해보자
// 각각 for문이 내부로 갈 수록 그 전 연산자에 +1 한 값으로 시작하기 때문에
// 겹치지 않는다.
for(let i = 0; i < nums.length - 2; i++){
for(let j = i + 1; j < nums.length - 1; j++){
for(let k = j + 1; k < nums.length; k++){
// 세 숫자의 합
let sum = nums[i] + nums[j] + nums[k];
// sum들의 집합을 만든다.
sums.push(sum);
}
}
}
// sums 원소 중 최댓값을 찾는다.
let max = Math.max(...sums);
// max까지의 소수 구하기
let isPrime = new Array(max + 1).fill(true);
isPrime[0] = false;
isPrime[1] = false;
for(let i = 2; i*i <= max; i++){
if(isPrime[i]){
// 소수의 배수는 소수가 아니므로, 그 것들을 찾아내기 위해 곱 연산 진행
let multiple = 2;
// 연산은 n보다 작을 때까지 진행할 것
while(i * multiple <= max){
isPrime[i * multiple] = false;
multiple++;
}
}
}
// 소수인 개수를 체크하는 카운트
let count = 0;
for(let i = 0; i < sums.length; i++){
if(isPrime[sums[i]]){
count++;
}
}
return count;
}
세 숫자의 합을 구현하는 것과 소수 판별을 위한 배열을 만드는 것이 관건이다.
둘 중 하나라도 못하면 못 푼다.
세 숫자의 합을 구하는 것은 for문을 여러번 사용해서 쉽게 구현할 수 있다.
여기서 구한 합은 sums 배열에 넣어놓는다.
에라토스테네스의 체 방식을 사용하여 소수 판별 배열을 만들었다.
isPrime 배열은 인덱스 번호가 곧 자연수를 의미한다.
따라서 sums의 배열 원소를 isPrime의 인덱스로 사용하면
sums의 그 숫자가 소수인지 아닌지 판별할 수 있다.
소수가 맞다면 count를 증가시키고
최종적으로 연산이 끝난 count를 출력한다.