반응형
🔐 문제 설명
https://school.programmers.co.kr/learn/courses/30/lessons/12921
🔐 문제 분석
- 에라토스테네스의 체를 이용하여 소수를 판별한다. (일반적인 소수판별 로직의 경우 효율성 테스트를 통과하지 못함)
1. 2부터 소수를 구하고자 하는 구간의 모든 수를 나열한다. 그림에서 회색 사각형으로 두른 수들이 여기에 해당한다.
2. 2는 소수이므로 오른쪽에 2를 쓴다. (빨간색)
3. 자기 자신을 제외한 2의 배수를 모두 지운다.
4. 남아있는 수 가운데 3은 소수이므로 오른쪽에 3을 쓴다. (초록색)
5. 자기 자신을 제외한 3의 배수를 모두 지운다.
6. 남아있는 수 가운데 5는 소수이므로 오른쪽에 5를 쓴다. (파란색)
7. 자기 자신을 제외한 5의 배수를 모두 지운다.
8. 남아있는 수 가운데 7은 소수이므로 오른쪽에 7을 쓴다. (노란색)
9. 자기 자신을 제외한 7의 배수를 모두 지운다.
10. 위의 과정을 반복하면 구하는 구간의 모든 소수가 남는다. (보라색)
🔐 문제 풀이
/** 에라토스테네스의 체 사용X */
class Solution {
public int solution(int n) {
int answer = 1; // 2는 소수이므로 카운트를 한 후 3부터 시작
for (int i = 3; i <= n; i++) {
if (i % 2 == 0) { // 짝수는 제외
continue;
}
boolean isPrime = true;
for (int j = 3; j < i; j++) {
if (i % j == 0) {
isPrime = false;
break;
}
}
if (isPrime) {
answer++;
}
}
return answer;
}
}
/** 에라토스테네스의 체 사용O */
class Solution {
public int solution(int n) {
int answer = 0;
boolean[] prime = new boolean[n + 1];
for (int i = 2; i <= n; i++) {
prime[i] = true; // 2 ~ n번째 수를 true로 초기화
}
//제곱근 구하기
int root = (int) Math.sqrt(n);
for (int i = 2; i <= root; i++) { // 2 ~ 루트n까지 검사
if (prime[i]) { // i번째의 수가 소수일 때
for (int j = i; i * j <= n; j++) // 그 배수들을 다 false로 초기화(배수는 소수가 아니기 때문)
prime[i * j] = false;
}
}
for (int i = 2; i <= n; i++) {
if (prime[i])
answer++;
}
return answer;
}
}
반응형
'Algorithm' 카테고리의 다른 글
[프로그래머스] Lv1. 실패율 (0) | 2023.06.25 |
---|---|
[프로그래머스] Lv1. 명예의 전당 (1) (0) | 2023.06.25 |
[프로그래머스] Lv1. 소수 만들기 (0) | 2023.06.24 |
[프로그래머스] Lv1. 덧칠하기 (0) | 2023.06.23 |
[프로그래머스] Lv1. 카드 뭉치 (0) | 2023.06.12 |