👀 문제
https://programmers.co.kr/learn/courses/30/lessons/12921
👊 도전
1. 설계
- 에라토스테네스의 체를 이용한다.
2. 구현 (성공 코드)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import java.util.*;
/**
*
* @author HEESOO
*
*/
class Solution {
public int solution(int n) {
int answer = 0;
boolean[] prime=new boolean[n+1];
Arrays.fill(prime, true);
prime[0]=prime[1]=false;
int rootN=(int)Math.sqrt(n);
for(int i=2;i<=rootN;i++){
if(!prime[i]) continue;
for(int j=i+i;j<=n;j+=i){
prime[j]=false;
}
}
for(boolean num:prime){
if(num) answer++;
}
return answer;
}
}
3. 결과
🤟 성공 🤟
4. 설명
- 에라토스테네스의 체를 이용한다.
- 인덱스 번호가 n까지 있는 boolean형 배열을 선언한다. 이때 인덱스가 숫자를 뜻한다.
- 0은 사용하지 않기 때문에, 1은 소수도 합성수도 아니므로 false로, 나머지는 true로 초기화한다.
- 숫자가 소수일 경우 true를 저장한다.
- 2부터 루트n까지 중 소수는 true로, 소수의 배수는 false를 저장한다.
- 첫 번째 for문에서 2부터 루트n까지 중 소수를 찾는다. prime[i]가 false라면 i는 합성수라는 뜻이므로 continue한다.
- prime[i]가 true일 경우 소수이므로 해당 i는 살려두고 두 번째 for문을 사용하여 n까지의 i의 배수를 모두 false처리한다.
- 이중 for문이 끝난 후, 다시 prime배열을 순회하며 true인 값의 갯수를 리턴한다.
👏 해결 완료!
소수를 구하는 알고리즘에는 에라토스테네스의 체가 제일 효율성이 좋다는 것을 명심해두어야겠다.
참고
- 에라토스테네스의 체를 통해 소수 문제 정복 :: 마이구미 https://mygumi.tistory.com/66