이번 글에서는 하나의 숫자를 입력받아 각 자릿수의 합을 계산한 뒤, 그 합보다 크거나 같은 수 중에서 가장 가까운 소수를 반환하는 자바스크립트 함수를 작성해 보겠습니다.
문제 접근 방식
이 문제는 크게 세 단계로 나누어 해결할 수 있습니다.
- 자릿수의 합 계산: 재귀 함수를 활용해 숫자의 각 자릿수를 모두 더합니다.
- 소수 판별: 특정 수가 소수인지 확인하는 함수를 만듭니다.
- 가장 가까운 소수 찾기: 자릿수의 합부터 시작해 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));
코드 동작 원리
digitSum 함수: 재귀 호출을 통해 자릿수를 분리합니다. num % 10은 마지막 자릿수를, Math.floor(num / 10)은 마지막 자릿수를 제거한 나머지 부분을 의미합니다. 숫자가 0이 되면 지금까지 누적된 합을 반환합니다.
isPrime 함수: 1은 소수가 아니므로 false를, 2는 소수이므로 true를 반환합니다. 그 외의 경우에는 2부터 n-1까지의 수로 나누어 떨어지는지 검사해 소수 여부를 판단합니다.
nearestPrime 함수: 먼저 자릿수의 합을 구한 뒤, 해당 값이 소수가 아닐 동안 1씩 증가시켜 조건을 만족하는 가장 가까운 소수를 찾습니다.
출력 결과
위 코드를 실행하면 콘솔에 다음과 같은 결과가 출력됩니다.
29
숫자 56563의 자릿수 합은 5 + 6 + 5 + 6 + 3 = 25입니다. 25는 소수가 아니므로 26, 27, 28을 차례로 검사하고, 29가 소수이기 때문에 최종 결과는 29가 됩니다.