본문 바로가기
Algorithm/Baekjoon

백준 2581번

by minhi 2025. 1. 20.

백준 2581번을 풀어보았다.

 

앞의 문제들과 거의 동일한 아이디어를 사용한다.

 

소수를 찾을 땐 1부터 N까지 확인해볼 수도 있지만 1부터 N의 제곱근까지 확인하는 게 더 효율적이고

 

이때 반복문 대신 filter 메소드를 사용할 수도 있으며

 

배열의 합을 구할 땐 반복문을 사용할 수도 있지만 reduce 메소드를 사용하는 게 더 효율적이라는 것.

 

참고) 백준 2501번, 9506번, 1978번

 

위 내용을 바탕으로 이 문제는 크게 두 가지 풀이로 구분할 수 있다.

  • 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을 제외할 수 있다.

'Algorithm > Baekjoon' 카테고리의 다른 글

백준 1157번  (0) 2025.01.23
백준 11653번  (0) 2025.01.22
백준 1978번  (0) 2025.01.17
백준 9506번  (0) 2025.01.17
백준 2501번  (0) 2025.01.16