[백준 / BOJ] 4948번 베르트랑 공준 (Javascript / Node js)

2023. 10. 21. 23:10코딩 테스트 (BOJ)

https://www.acmicpc.net/problem/4948

 

4948번: 베르트랑 공준

베르트랑 공준은 임의의 자연수 n에 대하여, n보다 크고, 2n보다 작거나 같은 소수는 적어도 하나 존재한다는 내용을 담고 있다. 이 명제는 조제프 베르트랑이 1845년에 추측했고, 파프누티 체비쇼

www.acmicpc.net

 

 

문제 해석

이 문제는 에라토스테네스의 체를 이용해서 소수들이 검사되어 있는 배열을 생성해주는 메소드를 만들어주고,

 

함수의 인자로 배열의 크기(2N), 검사할 수의 시작 인덱스(M)를 인자로 받아 반복문을 통해 해당 범위내의 소수의 수를 세준 뒤 return해주면 되겠다. 

 

 

에라토스테네스의 체를 이해하기 위해서는 아래 링크를 참고해주시면 감사하겠습니다.

 

[백준 / BOJ] 1929번 소수 구하기 (Javascript / Node js) (tistory.com)

 

[백준 / BOJ] 1929번 소수 구하기 (Javascript / Node js)

https://www.acmicpc.net/problem/1929 1929번: 소수 구하기 첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다. www.acmicpc.n

dnd0707.tistory.com

 

 

전체코드
 
const fs = require("fs");

const input = fs
  .readFileSync("../input.txt")
  .toString()
  .trim()
  .split("\n")
  .map((item) => Number(item));

input.pop();

const Eratos = (M, N) => {  //에라토스테네스의 체 메소드
  var arr = [];

  arr[0] = false;
  arr[1] = false;

  for (let i = 2; i <= N; i++) { 
    arr.push(true);
  }

  for (let i = 2; i * i <= N; i++) {
    if (arr[i]) {
      for (let j = i * i; j <= N; j += i) {
        arr[j] = false;
      }
    }
  }

  let cnt = 0;

  for(let i = M; i< arr.length; i++){
    if(arr[i]){
       cnt++;
    }
  }

  return cnt;
};

let answer = [];

for(let i=0; i<input.length; i++){
    answer.push(Eratos(input[i] + 1, input[i]*2));
}

console.log(answer.join("\n"));
 

 

이번 문제는 지난번 풀었던 소수 구하기와 너무 유사하여 글을 쓸지 말지 고민됐지만, 이렇게 몇 자라도 적으며 한번이라도 더 알고리즘을 복기하고자 포스팅했다. 이제 에라토스테네스의 체는 확실하게 활용할 수 있을 것 같다.