자바스크립트에서 숫자로 이루어진 배열에서 소수(prime number)만 제거하고 싶은 경우가 종종 있습니다. 이번 글에서는 소수 판별 함수를 직접 작성하고, 배열의 내장 메서드인 filter()와 조합하여 소수가 포함되지 않은 새로운 배열을 만드는 방법을 알아보겠습니다.
문제 정의
다음과 같은 숫자 배열이 주어졌을 때,
const arr = [34, 56, 3, 56, 4, 343, 68, 56, 34, 87, 8, 45, 34];
소수를 모두 제거한 새로운 배열을 반환하는 함수를 작성해야 합니다.
소수 판별 로직 이해하기
구현에 앞서 소수의 정의를 간단히 짚고 넘어가겠습니다. 소수란 1보다 크면서 1과 자기 자신 외에는 약수를 가지지 않는 수입니다. 따라서 판별 함수는 다음 규칙을 따릅니다.
- 1은 소수가 아니므로
false를 반환합니다. - 2는 가장 작은 소수이므로
true를 반환합니다. - 그 외의 수는 2부터 n-1까지 차례대로 나누어 보고, 하나라도 나누어 떨어지면 소수가 아닙니다.
예제 코드
전체 구현 코드는 다음과 같습니다.
const arr = [34, 56, 3, 56, 4, 343, 68, 56, 34, 87, 8, 45, 34];
// 소수 판별 함수
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 filterPrime = arr => {
const filtered = arr.filter(el => !isPrime(el));
return filtered;
};
console.log(filterPrime(arr));코드 설명
- isPrime(n): 인자로 받은 숫자가 소수인지 검사하는 함수입니다. 1과 2를 먼저 처리한 뒤, 반복문으로 2부터 n-1까지의 수로 나누어 나머지가 0이 되는 경우가 있으면 합성수로 판단합니다.
- filterPrime(arr):
Array.prototype.filter()메서드를 사용해 각 요소를 검사합니다.!isPrime(el)조건 덕분에 소수가 아닌 값들만 남게 됩니다. filter()는 원본 배열을 변경하지 않고 새로운 배열을 반환하므로, 기존 데이터가 그대로 유지된다는 장점이 있습니다.
실행 결과
콘솔에 출력되는 결과는 다음과 같습니다. 원본 배열에서 소수인 3이 제거된 것을 확인할 수 있습니다.
[ 34, 56, 56, 4, 343, 68, 56, 34, 87, 8, 45, 34 ]
마무리 및 성능 개선 팁
위 코드는 동작하지만, 소수 판별 시 매번 n-1까지 전부 검사하므로 비효율적일 수 있습니다. 실제 프로젝트에서는 n의 제곱근(√n)까지만 검사해도 충분합니다. 예를 들어 반복문 조건을 x <= Math.sqrt(n)으로 바꾸면 시간 복잡도를 O(n)에서 O(√n)으로 줄일 수 있어, 큰 숫자를 다룰 때 성능이 크게 향상됩니다.