게으른개발너D

[JS] 소수찾기 본문

알고리즘/문제

[JS] 소수찾기

lazyhysong 2023. 7. 18. 18:41

https://programmers.co.kr/learn/courses/30/lessons/12921?language=javascript

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

Question

1부터 입력받은 숫자 n 사이에 있는 소수의 개수를 반환하는 함수, solution을 만들어 보세요.

소수는 1과 자기 자신으로만 나누어지는 수를 의미합니다.
(1은 소수가 아닙니다.)

 

제한조건

  • n은 2 이상 1000000 이하의 자연수입니다.

입출력 예

n return
10 4
5 3

 


Solution

1부터 n까지의 숫자 중 소수를 모두 찾아야할 경우엔 에라토스테네스의 체를 쓰는 것이 가장 효율적이다.

하지만 비교를 하기 위해 다른 알고리즘도 이용해 보겠다.

 

1. 단순 루프로 풀기

2부터 n까지 루프를 돌려 찾기

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

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

이 경우는 성능이 매우 느리기 때문에 모든 케이스를 통과하지 못한다.

 

2. 제곱근까지만 루프 돌리기

소수는 그 소수의 제곱근 위로의 수로는 나눠지지 않으므로 2부터 n의 제곱근까지만 루프를 돌려준다.

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

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

정확성 테스트는 시간초과 없이 모두 통과하지만 효율성 테스트에서 모두 실패한다.

 

 

3. 에라토스테네스의 체

// O(n log n)
function getPrimes(num) {
  const primeArr = [false, false, ...Array(num - 1).fill(true)];
  
  for(let i = 2; i * i <= num; i++) {
    if (primeArr[i]) {
      for(let j = i * 2; j <= num; j += i) {
        primeArr[j] = false;
      }
    }
  }
  
  return prime.filter(Boolean);
}

function solution(n) {
  return getPrimes(n).length;
}

'알고리즘 > 문제' 카테고리의 다른 글

[JS] Dijkstra - 배달  (0) 2023.07.29
[JS] 순열과 조합 - 두 개 뽑아서 더하기  (0) 2023.07.18
[JS] Greedy - 큰 수 만들기  (0) 2023.07.17
[JS] BFS, DFS - 가장 먼 노드  (0) 2023.07.11
[JS] Binary Search - 입국심사  (0) 2023.07.11
Comments