주어진 숫자 범위 안에서 소수를 전부 더하시오.
10이 주어지면 2, 3, 5, 7 이 소수이며 합이 17이다.
function sumPrimes(num) {
let numbers = []; // 가.
for (let i = 2; i <= num; i++){ // 나.
numbers.push(i);
}
for (let i = 2; i <= num; i++){ // 다.
for (let j = 0; j < numbers.length; j++){ // 라.
if (Number.isInteger(numbers[j] / i) && (numbers[j] / i) > 1) { // 마.
numbers.splice(j, 1);
}
}
}
const sumOfPrimes = (acc, curr) => acc + curr; // 바.
return numbers.reduce(sumOfPrimes);
}
가. numbers
변수는 2부터 주어진 숫자까지 담는 배열이다.
나. 2부터 주어진 숫자까지 반복한다.
다. 2부터 주어진 숫자까지 반복하고
라. 0부터 numbers
길이보다 작을 때까지 반복한다.
마. numbers
의 j
번째의 숫자를 i
로 나눴을 때 정수이면서, 1보다 크면 i
의 배수의 이므로 소수에서 제외된다.
바. 변수 sumOfPrimes
는 reduce 메소드의 callback 함수로 사용되는 함수를 정의했다.
풀이하면서 반복문을 중첩해서 사용한 점이 마음에 안 든다. 반복문을 중첩해서 사용하지 않고 풀이하는 방법이 있을 거 같다. 좀 더 생각해 보고 다른 풀이 방법을 생각해 봐야겠다.
위의 풀이 방법은 에라토스테네스의 체를 구현 방법이다. 연속되는 숫자들 중에 2는 자기자신과 1로 나누어 지고 나머지 숫자들은 2로 나누어지는 것들은 제외한다는 소수판별법이다.