알고리즘 풀이/프로그래머스
[level1] 프로그래머스 - 소수 찾기(JAVA)
데롱디롱
2021. 8. 31. 02:18
728x90
- 1~n까지의 모든 소수를 구하는 방법 => 에라토스테네스체 이용
(1) 1~n까지의 소수 유무를 저장할 배열을 만들고, 일단 모든 수를 소수라고 저장(true)
boolean[] Eratos = new boolean[n + 1]; Arrays.fill(Eratos, true);
(2) 2부터 자신이 소수이면, 자신으로 나누어 떨어지는 수는 소수가 아니므로 지움
for (int i = 2; i * i <= n; i++) { if (Eratos[i]) for (int j = i * i; j <= n; j += i) // 자신으로 나눌 수 있는 수 지우기 Eratos[j] = false; }
- 이 과정을 i * i <=n 까지 반복하면 구하는 구간의 모든 소수만 남는다.(true)
ㄴ 1~n 구간의 소수를 찾고 싶은 경우, t * t >n을 만족하는 t보다 작은 배수만 지워도 됨
ex) 1~120이면, 11 * 11 >120 이므로,
11보다 작은 수 배수들만 처리해주면 됨
- t보다 작은 배수를 지우고 남은 수는 모두 소수!!
import java.util.Arrays;
class Solution {
public int solution(int n) {
boolean[] Eratos = new boolean[n + 1];
Arrays.fill(Eratos, true);
for (int i = 2; i * i <= n; i++) {
if (Eratos[i])
for (int j = i * i; j <= n; j += i)
Eratos[j] = false;
}
int answer = 0;
for (int i = 2; i <= n; i++)
if (Eratos[i])
answer++;
return answer;
}
}