1부터 입력받은 숫자 n 사이에 있는 소수의 개수를 반환하는 함수, solution을 만들어 보세요.
소수는 1과 자기 자신으로만 나누어지는 수를 의미합니다.
(1은 소수가 아닙니다.)
간단한 문제 같은데 계속 시간초과가 걸리게 된다. 검색한 결과 에라토스테네스의 체라는 소수를 찾는 방법을 이용해야 한다.
에라토스테네스의 체 알고리즘
출처 : 에라토스테네스의 체
class Solution {
public int solution(int n) {
int answer = 0;
int cnt = 0;
for(int i=2; i<=n; i++){
cnt = 0;
for(int j=2; j<=i; j++){
if(i%j == 0){ //약수 구하기
cnt++;
}
if(cnt>=2) break;
}
if(cnt==1) answer++;
}
return answer;
}
}
제한조건에 n은 2이상 1000000이하의 자연수입니다. 때문에 효율성에 문제가 생긴다..
class Solution {
public int solution(int n) {
int answer = 0;
int[] number = new int[n+1];
//number 배열에 넣어주기
for(int i=2; i<=n; i++){
number[i] = i;
}
//배수들 0만들기
for(int i=2; i<=n; i++){
if(number[i]==0) continue;
for(int j=2*i; j<=n; j +=i){
number[j] = 0;
}
}
for(int i=0; i<number.length; i++){
if(number[i]!=0) answer++;
}
return answer;
}
}
에라토스테네스의 체를 이용한 코드
출처 : programmers 소수찾기