function num(number) {
if (number % 2 ===0 || number % 3 === 0) return false;
for (let i = 5; i * i <= number; i += 6) {
if (number % i === 0 || number % (i + 2) === 0) return false;
}
return true;
}
function solution(nums) {
let answer = 0;
let number = [];
for(let i = 0; i < nums.length ; i++){
for(let j = i+1; j < nums.length; j++){
for(let z = j+1 ; z< nums.length; z++){
number.push(nums[i]+nums[j]+nums[z]);
}
}
}
number.map(a => {
if (num(a)) answer++;
})
return answer;
}
function primecheck(n){
for(var i=2;i<=Math.sqrt(n);i++){
if(n%i == 0){
return false;
}
}
return true;
}
function solution(nums){
var cnt = 0;
for(var i=0;i<nums.length-2;i++){
for(var j=i+1;j<nums.length-1;j++){
for(var w=j+1;w<nums.length;w++){
if(primecheck(nums[i]+nums[j]+nums[w])){
cnt++;
}
}
}
}
return cnt;
}
다른 답과 내 답의 차이점은 Math.sqrt와 에라토스테네스의 체 사용 유무이다.
에라토스테네스의 체는 주어진 범위 내의 모든 소수를 찾기 위한 알고리즘이다.
근데 가독성은 다른 답이 좋다...
내가 쓴 답을 해석하자면
function num(number) {
if (number % 2 ===0 || number % 3 === 0) return false;
for (let i = 5; i * i <= number; i += 6) {
if (number % i === 0 || number % (i + 2) === 0) return false;
}
return true;
}
이 부분이 왜 쓰였는지가 가장 의문일 것 같다.
한 줄씩 설명하자면
우선 2와 3으로 나눠지면 소수가 아니다.
반복문을 통해서 소수인지 아닌지를 판별했는데
5부터 시작인 이유는 2,3 다음 소수는 5이기 때문이다.
i * i <= number
이부분은 number가 제곱근보다 큰 약수를 찾을 필요가 없기 때문이다
이걸 다르게 작성하면 i <= Math.sqrt(number)
가 된다.
i에 6씩 더하는 이유는 6의 배수는 2, 3으로 나누어 떨어지기 때문에 소수가 아닌 수로 판명할 수 있다.
if문에서 i+2를 하는 이유는 에라토스테네스의 체에서는 6n-1와 6n+1의 숫자를 확인해야하기 때문에 i로 나누어 떨어질 때랑 i+2로 나누어 떨어질 때를 계산한다. (if문이 true일 경우에는 소수가 아니다.)