N까지의 소수를 검사할때 N의 제곱근 까지만 하는 이유

박동현·2022년 5월 20일
1

알고리즘

목록 보기
2/2
post-thumbnail
post-custom-banner

BOJ 문제 풀이 도중 소수를 판별하는 문제를 풀이하게 되었다.
문제 풀이를 하던 중 무식하게 모든 경우를 탐색해서 풀게 되니 정답은 맞게 나오는데 시간 초과가 뜨는 것을 보게 되었고, 이런 무식한 방법이 아닌 다른 효율적인 방법이 있다는 것을 깨닫게 되어 그것을 찾아보던중 N까지 검사하는 것이 아닌 N의 제곱근까지만 검사하는 간단하지만 효과적인 방법이 있다는 것을 알게 되었다.

const input = require("fs").readFileSync("/dev/stdin").toString().trim();
var I = input.split("\n");
var N = Number(I.shift());
I = I[0].split(" ").map(Number);
var count = 0;
for (let i = 0; i < N; i++) {
  let flag = 1;
  if (I[i] == 1) continue;
  for (let j = 2; j <= Math.floor(Math.sqrt(I[i])); j++) {
    if (I[i] % j === 0) flag = 0;
  }
  if (flag) count++;
}
console.log(count);

j <= N 까지 검사하는 것을 Math.floor(Math.sqre(I[i]))) 를 사용하여 고쳐주었더니 시간초과를 해결할 수 있었다.

여기서 한가지 의문이 들었다. 왜 N의 제곱근 까지만 검사를 해도 되는가?
소수가 아닌 수 N 이 있다.
N = A X B 이고 N' 은 N의 제곱근이라고 표현한다.
A >= N' 이라면 A X B = N = N' X N' 이므로 B는 N' 보다 작거나 같다.
그렇기 때문에 N'까지 검사를 하게 되면 그 수의 소수여부를 알 수 있는 것이다.

profile
좋은 개발자가 되고싶은 전공자
post-custom-banner

0개의 댓글