안녕하세요

[node.js] 2581 소수 (자바스크립트) 기본수학단계2 /cfr 본문

백준 자바스크립트

[node.js] 2581 소수 (자바스크립트) 기본수학단계2 /cfr

sakuraop 2022. 6. 8. 23:26

2581 소수 

자연수 M과 N이 주어질 때 M이상 N이하의 자연수 중 소수인 것을 모두 골라 이들 소수의 합과 최솟값을 찾는 프로그램을 작성하시오.

60
100

M이상 N이하의 자연수 중 소수인 것을 모두 찾아 첫째 줄에 그 합을, 둘째 줄에 그 중 최솟값을 출력합니다.

M이상 N이하의 자연수 중 소수가 없을 경우는 첫째 줄에 -1을 출력합니다.

 

620
61

 

제출한 답

const [a, b] = require("fs").readFileSync("dev/stdin").toString().split("\n").map(Number);

let arr = [];

function prime(i) {
  for (j = 2; j * j <= i; j++) {
    if (i % j == 0) {
      return false;
    }
  }
  return true;
}

for (i = a; i <= b; i++) {
  arr.push(i);
  if (i == 1) {
    arr.pop();
  }
  if (i == b) {
    let primeList = arr.filter((i) => prime(i));
    if (primeList.length == 0) {
      console.log(-1);
    } else {
      let sum = 0;
      primeList.forEach((x) => {
        sum += x;
      });
      console.log(sum + "\n" + primeList[0]);
    }
  }
}

 

코드설명

m~n까지의 배열을 담은 리스트를 만듭니다. > [60, 61, ... , 100]

리스트에 담긴 배열을 filter 함수를 통해서 소수일 경우만 남깁니다. > [61, 63, ..., 97]

출력 사항에 따라 리스트에 남은 수들의 합과, 리스트의 첫번째 인덱스를 반환합니다. 620, 61

  • let arr = [];
    리스트를 만들어 M이상 N이하의 수를 배열로 만듭니다.

  • [소수 찾기] 소수인지 알기 위해서는 소수인지 알고자 하는 수를, 2부터 그 수의 제곱근 까지 나누어 보았을 때 모든 경우에 나머지가 0이 아니어야 합니다. 7%6 = 1 > 소수입니다    9%3 = 0 > 소수가 아닙니다.
    function prime(i) {
      for (j = 2; j * j <= i; j++) {
        if (i % j == 0) {
          return false; }
      }
      return true;
    }
    소수인지 판별하고자 하는 수를 2부터 그 수의 제곱근까지 나누어보고
    0인 경우가 없다면 그 수는 소수이므로 반환합니다. 

  • for (i = a; i <= b; i++) {
      arr.push(i);
      if (i == 1) {
        arr.pop();
      }
    m~n까지의 수를 리스트에 넣습니다.
    1은 소수가 아니고, 1로는 무조건 나누어 떨어지기 때문에 따로 처리합니다. 

  •   if (i == b) {
    m~n 까지의 수가 리스트에 전부 담겼다면,
    (따로 떼어 내 걸러내는 것이 적절하지만, for문이 세 번 사용되는 것이 싫어 같이 처리했습니다. 나중에 코드 개선이 필요해 보입니다.)

        let primeList = arr.filter((i) => prime(i));
    filter 함수를 통해서 리스트에 소수만을 남깁니다.

  •     if (primeList.length == 0) {
          console.log(-1);
    객체에 어떤 수도 남아있지 않을 경우 소수가 없다는 의미이므로 -1을 출력합니다.

  •     } else {
          let sum = 0;
          primeList.forEach((x) => {
            sum += x;
          });
          console.log(sum + "\n" + primeList[0]);
    객체에 남아있는 소수의 합과 가장 작은 수인 첫번째 인덱스를 행을 나누어 출력합니다.