[Algorithms] 소수 구하기

소수

1 제외, 1과 자기 자신만을 약수로 갖는 정수

구현방법

#1. 2부터 N의 제곱근까지만 체크하며, 체크하는 방식은 2부터 현재 자기 자신의 숫자이외 나누어 떨어지는 숫자가 있는지 체크, 하지만 효율성에서 통과 못함

// O(sqrt(n))
function isPrime(num) {
  for (let i = 2; i * i <= num; i += 1) {
    if (num % i == 0) {
      return false;
    }
  }

  return true;
}

function solution(n) {
  let answer = 0;
  for (let i = 2; i <= n; i += 1) {
    if (isPrime(i)) {
      answer += 1;
    }
  }

  return answer;
}

#2. 에라토스테네스의 체를 이용, N의 범위 만큼 만든 후 배수가 되는 Index는 제외

0(Except) 1(Except) 2 3
4(Except) 5 6(Except) 7
8(Except) 9(Except) 10(Except) 11
12(Except) 13 14(Except) 15(Except)
function solution(n) {
  var answer = n - 1; // 소수는 1 제외

  // 숫차 체크할 배열 생성
  let chkArr = Array.from({ length: n + 1 }, () => 0);

  // 2부터 시작
  for (let i = 2; i * i < n; i++) {
    if (chkArr[i] === 1) continue;

    // 자기 자신은 제외, 2부터 시작
    for (let j = 2; j * i <= n; j++) {
      if (chkArr[j * i] === 0) {
        chkArr[j * i] = 1;
        answer--;
      }
    }
  }

  //console.log(chkArr);
  return answer;
}

Categories:

Updated:

Leave a comment