문제 이해하기
이번 문제에서는 숫자를 첫 번째이자 유일한 인수로 받는 JavaScript 함수를 작성해야 합니다. 함수는 입력된 숫자를 구성하는 각 자릿수 중에서 소수에 해당하는 값들만 골라 모두 더한 합계를 반환해야 합니다.
예를 들어, 입력 숫자가 다음과 같다고 가정해 보겠습니다.
const num = 67867852;
이때 기대되는 출력 결과는 다음과 같습니다.
const output = 21;
그 이유는 숫자 67867852를 구성하는 자릿수 중 소수는 7, 8을 제외한 7 + 7 + 5 + 2 = 21이기 때문입니다.
접근 방법
한 자리 숫자 중 소수는 2, 3, 5, 7뿐이므로, 이 네 개의 숫자만 확인하면 됩니다. 문제를 해결하는 절차는 다음과 같습니다.
- 나머지 연산자(
%)를 사용해 숫자의 마지막 자릿수를 하나씩 추출합니다. - 추출한 자릿수가 소수(2, 3, 5, 7)에 포함되는지 판별하고, 소수라면 합계 변수에 더합니다.
Math.floor()로 숫자를 10으로 나누어 자릿수를 하나씩 제거하며 반복합니다.- 숫자가 0이 되면 반복을 종료하고 최종 합계를 반환합니다.
예제 코드
const num = 67867852;
const sumPrimeDigits = (num) => {
const primes = '2357';
let sum = 0;
while(num){
const digit = num % 10;
if(primes.includes('' + digit)){
sum += digit;
};
num = Math.floor(num / 10);
};
return sum;
};
console.log(sumPrimeDigits(num));출력 결과
위 코드를 실행하면 콘솔에 다음과 같은 결과가 출력됩니다.
21
코드 설명
코드의 동작 원리를 단계별로 살펴보겠습니다.
primes문자열에는 한 자리 소수인 2, 3, 5, 7이 담겨 있습니다.while루프는 입력 숫자가 0이 될 때까지 매번 마지막 자릿수를num % 10으로 추출합니다.includes()메서드를 활용해 현재 자릿수가 소수 목록에 있는지 확인합니다. 이때'', digit처럼 템플릿 리터럴 또는 문자열 변환을 통해 비교합니다.- 소수라면
sum에 더하고,Math.floor(num / 10)으로 이미 확인한 자릿수를 제거합니다.
이 방식은 별도의 소수 판별 로직 없이 문자열 포함 여부만 검사하면 되기 때문에 코드가 간결하고 실행 속도도 빠릅니다. 시간 복잡도는 숫자의 자릿수 길이에 비례하여 O(log n)입니다.