이번 글에서는 숫자를 입력받아 각 자릿수의 합을 계산한 뒤, 그 합보다 크거나 같은 소수(prime number) 중 가장 가까운 값을 반환하는 JavaScript 함수를 작성해 보겠습니다.
예를 들어 입력값이 56563이라면 각 자릿수의 합은 5 + 6 + 5 + 6 + 3 = 25입니다. 25는 소수가 아니므로, 25보다 크거나 같은 첫 번째 소수인 29를 결과로 반환해야 합니다.
구현 방법
이 문제는 세 단계로 나누어 해결할 수 있습니다.
1. 자릿수 합 계산하기
재귀 함수를 사용하여 숫자를 10으로 나누면서 마지막 자릿수(num % 10)를 더하는 방식으로 자릿수의 합을 구합니다.
2. 소수 판별하기
isPrime 함수는 1은 소수가 아니고, 2는 소수이며, 그 외의 숫자는 2부터 n-1까지의 수로 나누어 떨어지는지 확인합니다.
3. 가장 가까운 소수 찾기
자릿수의 합이 소수가 될 때까지 1씩 증가시키며 반복 검사하면 원하는 결과를 얻을 수 있습니다.
전체 코드 예제
const num = 56563;
// 재귀적으로 자릿수의 합을 계산하는 함수
const digitSum = (num, sum = 0) => {
if(num){
return digitSum(Math.floor(num / 10), sum + (num % 10));
}
return sum;
};
// 소수 여부를 판별하는 함수
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 nearestPrime = num => {
let sum = digitSum(num);
while(!isPrime(sum)){
sum++;
}
return sum;
};
console.log(nearestPrime(num));실행 결과
콘솔에 출력되는 결과는 다음과 같습니다.
29
코드 설명
digitSum 함수는 숫자가 0이 될 때까지 재귀 호출을 반복하며, 매번 10으로 나눈 나머지(마지막 자릿수)를 누적합에 더합니다. 예를 들어 56563 → 5656 + 3 → 565 + 6 ... 순서로 처리되어 최종적으로 25가 반환됩니다.
nearestPrime 함수는 이렇게 구한 합(25)이 소수인지 검사하고, 소수가 아니면 26, 27, 28, 29 순으로 값을 증가시키며 다시 검사합니다. 29는 소수이므로 반복문이 종료되고 29가 최종 결과로 반환됩니다.
참고로 위의 isPrime 함수는 단순하지만 이해하기 쉬운 방식입니다. 성능을 개선하려면 √n까지의 약수만 검사하거나, 에라토스테네스의 체와 같은 알고리즘을 활용할 수 있습니다.