프로그래머스
function solution(n){
let cnt = 1;
if(n===2) return cnt;
for(let i=3; i<=n; i++){
if(i%2===0) continue; //짝수인 경우는 패스
for(let j=3; j<=Math.sqrt(i); j++){
if(i%j===0){
cnt--;
break;
}
}
cnt++;
}
return cnt;
}
function solution(n){
let cnt = 1;
let isPrime = true;
for(let i=3; i<=n; i++){
for(let j=2; j<Math.sqrt(i); j++){
if(i%j===0){
isPrime = false;
break;
}
}
if(isPrime) cnt++;
isPrime = true;
}
return cnt;
}
두가지 풀이법 모두 테스트는 모두 통과했지만, 효율성 테스트는 통과하지 못했다.
function solution(n){
let answer = 0;
let arr = new Array(n+1).fill(true); //인덱스와 값을 맞추기 위해 +1 해줌.
for(let j=2; j<=n; j++){
if(!arr[j]) continue;
for(let k=j*2; k<=n; k+=j){
arr[k]=false;
}
}
for(let i=2; i<=n; i++){
if(arr[i]>0) answer++;
}
return answer;
}
function solution(n){
const s = new Set();
for(let i=1; i<=n; i+=2){
s.add(i);
}
s.delete(1);
s.add(2);
for(let j=3; j<=Math.sqrt(n); j+=2){
if(s.has(j)){
for(let k=j*2; k<=n; k+=j){
s.delete(k);
}
}
}
return s.size;
}
제곱근의 성질을 이용해 문제를 푸는 경우에는, 어떤 숫자가 소수인지 판별할때 사용했다. A라는 숫자가 소수인지 확인하기 위해서는 3부터 3의 제곱근까지의 숫자로 나누어떨어지는지를 확인하면 된다.
그런데, 이 문제에서는 특정 구간의 숫자에서 소수의 개수를 구해야한다. 예를 들어, 3부터 500까지의 숫자에서 소수의 개수를 구할때, 내가 푼 방법처럼 각각의 숫자에 대해 3부터 제곱근까지를 모두 확인한다면, 효율성 테스트를 통과할 수 없다.
따라서, 에라토스테네스의 체 방식을 사용해 각 숫자의 배수들은 모두 걸러서 검사해야하는 숫자의 개수를 줄여야한다.