Leetcode Java Count Primes
업데이트:
문제
코드
class Solution {
public int countPrimes(int n) {
if (n < 3) {
return 0;
}
int result = n / 2;
boolean[] notPrime = new boolean[n];
for (int i = 3; i * i < n; i += 2) {
if (notPrime[i]) {
continue;
}
for (int j = i * i; j < n; j += 2 * i) {
if (!notPrime[j]) {
result--;
notPrime[j] = true;
}
}
}
return result;
}
}
결과
설명
-
주어진 정수 n 미만의 양의 정수 중 소수의 개수를 구하는 문제이다.
-
주어진 정수가 3 미만일 경우, 가장 작은 소수인 2를 포함하지 않으므로 0을 주어진 문제의 결과로 반환한다.
- 문제 풀이에 필요한 변수를 정의한다.
- result는 소수의 개수를 저장하기 위한 변수로, $\frac{n}{2}$의 정수 값을 넣어준다.
- 주어진 정수 n 미만의 소수의 개수는 항상 $\frac{n}{2}$의 정수 값보다 같거나 작다.
- 주어진 n이 5일 경우, 소수의 개수는 2, 3로 2개이다.
- 주어진 n이 10일 경우, 소수의 개수는 2, 3, 5, 7로 4개이다.
- 주어진 n이 20일 경우, 소수의 개수는 2, 3, 5, 7, 11, 13, 17, 19로 8개 이다.
- notPrime은 소수가 아닌 값을 체크하기 위한 배열의 변수로, 주어진 정수 n의 사이즈로 초기화 한다.
- boolean형의 초기 값은 false로, 모든 값이 소수가 아닌 것으로 체크를 한다.
- result는 소수의 개수를 저장하기 위한 변수로, $\frac{n}{2}$의 정수 값을 넣어준다.
- 3 이상의 소수는 2 단위로 증가하기 때문에, 3부터 $i \times i$미만까지 2씩 증가시키며 반복을 수행한다.
- i가 소수인 경우, 반복을 계속 수행해준다.
- $i \times i$부터 n 전까지 $i \times 2$ 값들을 반복하며 아래를 수행한다.
- 2의 배수인 값은 소수가 아니기 때문에, 소수의 개수를 저장한 result의 값을 감소시킨다.
- 위와 동일한 이유로 notPrime에 소수가 아닌 값(false)으로 저장한다.
- 반복이 완료되면 주어진 정수 n 미만의 양의 정수 중 소수의 개수를 저장한 result를 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기