1부터 입력받은 숫자 n 사이에 있는 소수의 개수를 반환하는 함수, solution을 만들어 보세요.
소수는 1과 자기 자신으로만 나누어지는 수를 의미합니다.
(1은 소수가 아닙니다.)
public class PrimeNumberSearch {
public static void main(String[] args) {
Test t = new Test();
int n = 10;
int solution = t.solution(n);
System.out.println("solution = " + solution);
}
public int solution(int n) {
int answer = 0;
//에라토스테네스 체
boolean[] isPrime = new boolean[n+1];
isPrime [0] = true; //true일 경우 소수가 아님
isPrime [1] = true;
for(int i=2; i<n; i++){
for(int j=2; i*j<=n; j++){
isPrime[i*j] = true;
}
}
for(int i=1; i<=n; i++){
if(!isPrime[i]) answer++;
}
return answer;
}
}
처음에 소수를 구하래서 쉽게 구하는 방법인
for(int i=2; i<=n; i++){
if(n%i) return true;
}
이런식으로 하나씩 모두 나눠보는 방식으로 소수를 구했다. 이렇게 구하니까 프로그래머스에서 처음 보는 2900ms를 볼수 있었으며 시간초과와 효율성 검사에서 다 떨어졌다 ㅎㅎ... 그래서 인터넷을 찾아보니 에라토스테네스의 체
라는 방법이 있었다.
위 링크에서 내용은 확인하길 바란다. 아마 내용을 보지 않고 gif만 봐도 이해할 수 있을 것이다.
다음과 같은 내용을 가지고 알고리즘으로 구현한 결과인데 사실 쉬운 문제인줄 알고 시작했다가 다른 구현 문제보다 더 어려워서 애 먹었다... 에라토스테네스의 체 개념을 이해하고 꼭 풀어보길 바란다!
에라토스테네스 체 너무 어려워 하지만 소수를 엄청 빠르게 구해주므로 꼭 알고 있자