백준 2581번을 풀어보았다.
앞의 문제들과 거의 동일한 아이디어를 사용한다.
소수를 찾을 땐 1부터 N까지 확인해볼 수도 있지만 1부터 N의 제곱근까지 확인하는 게 더 효율적이고
이때 반복문 대신 filter 메소드를 사용할 수도 있으며
배열의 합을 구할 땐 반복문을 사용할 수도 있지만 reduce 메소드를 사용하는 게 더 효율적이라는 것.
위 내용을 바탕으로 이 문제는 크게 두 가지 풀이로 구분할 수 있다.
- M~N 중 소수인 것들만 배열에 넣기
- M~N 전부 배열에 넣고 소수인 것들만 필터링하기
소수인 것들만 배열에 넣기
let [M, N] = require('fs').readFileSync('/dev/stdin').toString().split('\n').map(Number)
let primeNumbers = []
for (let i = M; i <= N; i++) {
let isPrimeNumber = true
if (i === 1) { continue }
else {
for (let j = 2; j <= Math.sqrt(i); j++) {
if (i % j === 0) {
isPrimeNumber = false
break
}
}
}
if (isPrimeNumber === true) primeNumbers.push(i)
}
if (primeNumbers.length > 0) {
console.log(primeNumbers.reduce((acc, cur) => acc += cur, 0))
console.log(primeNumbers[0])
} else {
console.log(-1)
}
소수인 것들만 필터링하기
let [M, N] = require('fs').readFileSync('/dev/stdin').toString().split('\n').map(Number)
const numbers = Array(N-M+1).fill().map((_, index) => M+index)
const primeNumbers = numbers.filter((value) => {
if (value === 1) return false
for (let i = 2; i <= Math.sqrt(value); i++) {
if (value % i === 0) return false
}
return true
})
if (primeNumbers.length > 0) {
console.log(primeNumbers.reduce((acc, cur) => acc += cur, 0))
console.log(primeNumbers[0])
} else {
console.log(-1)
}
먼저 M~N 전부 배열에 넣어야 한다.
반복문을 사용할 수도 있겠지만 Array 객체의 fill 메소드를 사용하였다.*
이때 map 메소드의 콜백함수에서 배열 요소 매개변수는 사용되지 않으므로 _로 명명하였다.
* 참고) 백준 10811번
이후 소수인 것들만 필터링하기 위해 filter 메소드를 사용하였는데 if (value === 1)로 1은 따로 처리해주었다.
이때 다음과 같은 방법도 가능하다.
let [M, N] = require('fs').readFileSync('/dev/stdin').toString().split('\n').map(Number)
const numbers = Array(N-M+1).fill().map((_, index) => M+index)
const primeNumbers = numbers.filter((value) => {
for (let i = 2; i <= Math.sqrt(value); i++) {
if (value % i === 0) return false
}
return value > 1
})
if (primeNumbers.length > 0) {
console.log(primeNumbers.reduce((acc, cur) => acc += cur, 0))
console.log(primeNumbers[0])
} else {
console.log(-1)
}
return value > 1로 소수로 판별된 것들 중 1을 제외할 수 있다.
💫 이 문제를 통해 배운 것
• fill 메소드와 map 메소드를 함께 사용하면 동일하지 않은 값으로도 배열을 채울 수 있다.
• return value > 1로 소수 판별에서 1을 제외할 수 있다.