알고리즘
JAVA - 1부터 n사이에 소수의 개수 구하기
전주천둥새
2023. 12. 18. 16:42
▼ 기존 작성 코드
class Solution {
public int solution(int n) {
int answer = 0;
for(int i=2; i<=n; i++){
int cnt = 0;
for(int j=1; j<=i; j++){
if(i % j == 0) cnt ++;
if(cnt > 2) break;
}
if(cnt == 2) answer++;
}
return answer;
}
}
위 코드로 실행하였을때, 코드 자체는 성공하였으나 시간복잡도가 높아 통과되지 않는 케이스가 발생하였다.
▼ 수정된 코드
import java.util.*;
class Solution {
public int solution(int n) {
boolean[] isPrime = new boolean[n + 1];
Arrays.fill(isPrime, true);
isPrime[0] = isPrime[1] = false; // 0과 1은 소수가 아님
for (int i = 2; i * i <= n; i++) {
if (isPrime[i]) {
for (int j = i * i; j <= n; j += i) {
isPrime[j] = false; // i의 배수는 소수가 아님
}
}
}
int count = 0;
for (boolean prime : isPrime) {
if (prime) {
count++;
}
}
return count;
}
}
위 코드는 에라토스테네스의 체 알고리즘을 보고 작성한 코드이다.
해당 코드로 수정했을때 시간복잡도가 해결되어 모든 테스트 케이스에 통과할 수 있었다.
***************************************************************************************************************
에라토스테네스의 체 알고리즘 이란?
고대 그리스 수학자 에라토스테네스가 발견한 제곱근을 이용한 소수를 구하는 방법.
소수를 구하는 최적의 알고리즘이라고 합니다.
소수는 n의 배수가 아니고 입력받은 수를 그 수보다 작은 수들로 나누어서 떨어지면 소수가 아니다.
그러므로, 모두 나누어 볼 필요없이 n 제곱근 까지만 나누어서 떨어지면 소수가 아니다.
***************************************************************************************************************