어떤 수 n의 프리모리얼(primorial)은 처음 n개의 소수를 모두 곱한 값입니다. 소수들을 계승(factorial)처럼 곱한다고 해서 '소수 계승'이라고도 불립니다.
예를 들어, n = 4라고 가정해 보겠습니다.
이때 primorial(4)의 결과는 다음과 같습니다.
2 * 3 * 5 * 7 = 210
즉, 처음 네 개의 소수인 2, 3, 5, 7을 모두 곱하면 210이 됩니다.
문제 정의
우리는 하나의 숫자를 입력받아 해당 숫자의 프리모리얼 값을 반환하는 JavaScript 함수를 작성해야 합니다.
구현 접근 방식
이 문제는 두 단계로 나누어 해결할 수 있습니다.
1단계: 소수 판별 함수 만들기
주어진 수가 소수인지 아닌지를 판별하는 헬퍼 함수가 필요합니다. 1은 소수가 아니며, 2는 소수입니다. 그 외의 수는 2부터 자기 자신 미만까지의 수로 나누어 떨어지는지 확인합니다. 나누어 떨어지면 소수가 아니고, 끝까지 나누어 떨어지지 않으면 소수입니다.
2단계: 프리모리얼 계산 함수 만들기
3부터 시작하여 차례대로 수를 증가시키면서 소수를 찾습니다. 소수를 발견할 때마다 누적 곱에 곱해주고, 카운트가 목표 개수 n에 도달할 때까지 반복합니다. 첫 번째 소수인 2는 초기값으로 미리 곱해두므로 카운트는 1부터 시작합니다.
코드 구현
다음은 전체 코드입니다.
const num = 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 primorial = num => {
if (num === 0){
return 0;
}
let count = 1, flag = 3;
let prod = 2;
while (count < num){
if (isPrime(flag)){
prod *= flag;
count++;
};
flag++;
};
return prod;
};
console.log(primorial(num));코드 설명
- isPrime 함수: 매개변수로 받은 수가 1이면 false를, 2이면 true를 반환합니다. 그 외의 경우에는 2부터 n-1까지 반복하며 나누어 떨어지는 약수가 있는지 검사합니다.
- primorial 함수: 입력이 0이면 0을 반환합니다. prod 변수를 첫 번째 소수인 2로 초기화하고, flag 변수를 3부터 시작하여 소수를 찾을 때마다 prod에 곱합니다. count가 num에 도달하면 반복을 종료하고 최종 곱을 반환합니다.
실행 결과
위 코드를 실행하면 콘솔에 다음과 같은 출력이 표시됩니다.
210
n = 4일 때 처음 네 개의 소수 2, 3, 5, 7의 곱인 210이 올바르게 출력되는 것을 확인할 수 있습니다.