이번 글에서는 숫자 배열을 입력받아 그중 소수(prime number)에 해당하는 값들만 골라 합계를 반환하는 자바스크립트 함수를 작성해 보겠습니다.
소수란 1과 자기 자신 외에는 약수를 가지지 않는 1보다 큰 자연수를 말합니다. 예를 들어 2, 3, 5, 7, 11처럼 오직 1과 자신으로만 나누어 떨어지는 수가 여기에 해당합니다.
문제 접근 방식
이 문제는 크게 두 단계로 나누어 해결할 수 있습니다.
- 소수 판별 함수 작성: 주어진 숫자가 소수인지 아닌지를 판별합니다.
- 합계 계산: 배열을 순회하면서 소수인 요소만 더합니다.
1단계: 소수 판별 함수 (isPrime)
소수 판별은 2부터 n-1까지의 숫자로 차례대로 나누어 보는 방식으로 구현할 수 있습니다. 중간에 한 번이라도 나누어 떨어지면 소수가 아니며, 끝까지 나누어 떨어지지 않으면 소수입니다. 단, 1은 소수가 아니므로 별도로 처리하고, 2는 가장 작은 소수이므로 즉시 true를 반환합니다.
2단계: 배열 순회 및 합산 (primeSum)
배열의 각 요소를 isPrime 함수로 검사한 뒤, 소수인 경우에만 누적 합계에 더하면 됩니다.
예제 코드
const arr = [43, 6, 6, 5, 54, 81, 71, 56, 8, 877, 4, 4];
const isPrime = n => {
if (n === 1){
return false;
} else if(n === 2){
return true;
} else {
for(let x = 2; x < n; x++){
if(n % x === 0){
return false;
}
}
return true;
}
};
const primeSum = arr => {
let sum = 0;
for(let i = 0; i < arr.length; i++){
if(!isPrime(arr[i])){
continue;
}
sum += arr[i];
}
return sum;
};
console.log(primeSum(arr));실행 결과
콘솔에 출력되는 결과는 다음과 같습니다.
996
결과 분석
예제 배열에서 소수에 해당하는 값은 43, 5, 71, 877 네 개입니다. 이들의 합은 43 + 5 + 71 + 877 = 996이므로, 함수가 정상적으로 동작함을 확인할 수 있습니다.
성능 최적화 팁
위 코드는 이해하기 쉽지만, 더 큰 숫자를 다룰 때는 나눗셈 검사 범위를 √n까지만 줄이면 효율을 크게 높일 수 있습니다. 어떤 수 n이 a × b 형태로 표현될 때 a와 b 중 하나는 반드시 √n 이하이기 때문에, √n까지 나누어 떨어지지 않으면 소수임을 확신할 수 있습니다.