문제
자연수 N이 입력되면 1부터 N까지의 소수의 개수를 출력하는 프로그램을 작성하세요.
만약 20이 입력되면 1부터 20까지의 소수는 2, 3, 5, 7, 11, 13, 17, 19로 총 8개입니다.
입력
첫 줄에 자연수의 개수 N(2<=N<=200,000)이 주어집니다
출력
첫 줄에 소수의 개수를 출력합니다.
예시 입력 1
20
예시 출력 1
8
해결
소수 찾기 문제를 에라토스테네스의 체를 이용하여 푸는 김에
에라토스테네스의 체에 대해서 설명도 같이 하려고 한다.
먼저, 에라 토스테네스의 알고리즘부터 순서대로 나열해보겠다.
- 2부터 소수를 구하고자 하는 구간의 모든 수를 나열한다. 그림에서 회색 사각형으로 두른 수들이 여기에 해당한다.
- 2는 소수이므로 오른쪽에 2를 쓴다. (빨간색)
- 자기 자신을 제외한 2의 배수를 모두 지운다.
- 남아있는 수 가운데 3은 소수이므로 오른쪽에 3을 쓴다. (초록색)
- 자기 자신을 제외한 3의 배수를 모두 지운다.
- 남아있는 수 가운데 5는 소수이므로 오른쪽에 5를 쓴다. (파란색)
- 자기 자신을 제외한 5의 배수를 모두 지운다.
- 남아있는 수 가운데 7은 소수이므로 오른쪽에 7을 쓴다. (노란색)
- 자기 자신을 제외한 7의 배수를 모두 지운다.
- 위의 과정을 반복하면 구하는 구간의 모든 소수가 남는다.
위 설명만 봤을때는 조금 이해하기 어려운 감이 없지않아 있을 수 있다.
하지만, 생각보단 간단하다.
소수가 되는 수의 배수들을 모두 지우면 소수만 남는다.
이것을 표현한 알고리즘이다.
조금더 효율적으로 표현하자면 최대 크기의 제곱근보다 작은 소수의 배수들만 지우면 된다.
밑 코드를 보자.
먼저 숫자들을 담을 int 배열 ch를 만들어 줬다. 여기서 조금더 편리하게 작업하기 위해 n+1크기의 배열을 만들어줬다.
이렇게 되야 index값과 숫자의 값이 똑같아진다.
그리고 2부터 시작해서 소수이면 answer를 1씩 증가시켜준다. 그리고 소수의 배수들에는 1을 넣어준다.
여기서, ch의 값이 0 이면 소수이고 1이면 소수가 아닌것을 의미한다.
그렇게, 최종적인 answer가 소수의 개수가 된다.
CODE
import java.util.*;
public class Main {
public static int solution(int n){
int answer= 0;
int[] ch = new int [n+1]; // 소수이면 0, 소수가 아니면 1
for(int i=2; i<=n; i++){
if(ch[i]==0){
answer++;
for(int j=i; j<=n; j+=i){
ch[j] = 1;
}
}
}
return answer;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
System.out.println(solution(n));
}
}
결과
'문제 풀이 > 인프런' 카테고리의 다른 글
[JAVA11/알고리즘]3-2 공통원소 구하기 (0) | 2022.08.13 |
---|---|
[JAVA11/알고리즘]2-6 뒤집은 소수 (0) | 2022.08.11 |
[JAVA11/알고리즘]1-12 암호 (0) | 2022.08.08 |
[JAVA11/알고리즘]1-10 가장 짧은 문자거리 (1) | 2022.08.04 |
[JAVA11/알고리즘]1-8 유효한 팰린드롬 (0) | 2022.08.04 |