만만하게 봤다가 좌절한 문제...
에라토스어쩌구 체를 써야한다네ㅠ? 정답률 27%인 이유가 있었다...
얼핏 보면 쉬워 보이지만 에라토스테네스의 체를 이용하는 방법이다.
에라토스테네스의 체 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 수학에서 에라토스테네스의 체는 소수를 찾는 방법이다. 고대 그리스 수학자 에라토스테네스가 발견하였다. 알고리즘[편집] 2부터 소수를 구하고자 하는 구간
ko.wikipedia.org
▶ 에라토스테네스의 체 란?
- 2부터 소수를 구하고자 하는 구간의 모든 수를 나열한다. (그림 -회색 사각형)
- 2는 소수이므로 오른쪽에 2를 쓴다. (빨간색)
- 자기 자신을 제외한 2의 배수를 모두 지운다.
- 남아있는 수 가운데 3은 소수이므로 오른쪽에 3을 쓴다. (초록색)
- 자기 자신을 제외한 3의 배수를 모두 지운다.
- 남아있는 수 가운데 5는 소수이므로 오른쪽에 5를 쓴다. (파란색)
- 자기 자신을 제외한 5의 배수를 모두 지운다.
- 남아있는 수 가운데 7은 소수이므로 오른쪽에 7을 쓴다. (노란색)
- 자기 자신을 제외한 7의 배수를 모두 지운다.
- 위의 과정을 반복하면 구하는 구간의 모든 소수가 남는다.
알고리즘
1. 소수인지 판별하는 primeList 생성 크기는 N+1
그 중 0과 1은 소수가 아니므로 true
boolean[] primeList = new boolean[N+1];
primeList[0]=primeList[1]=true; //0,1은 소수 X
2. 2~N까지 반복한다.
반복문 i가 소수가 아니라면(true) 계속 진행한다.
for(int i=2; i<=N; i++) {
if(primeList[i]==true) {
continue;
}
3. i의 배수일때 = 약수에 i가 포함된다 = 소수 X
ex) 4의 배수인 16의 약수에 4가 포함되기 때문에 소수가 아니다.
※ j=j+1인 이유는 해당 숫자만큼 더해주어야하기 때문이다.
ex) 2, 4, 6, 8, 10이면 2씩 더해줌
for(int j=i*2; j<=N; j=j+i) {
primeList[j]=true;
}
false인 값만 출력해주면 된다.
최종코드
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int M = sc.nextInt();
int N = sc.nextInt();
boolean[] primeList = new boolean[N+1];
primeList[0]=primeList[1]=true;
for(int i=2; i<=N; i++) {
if(primeList[i]==true) {
continue;
}
for(int j=i*2; j<=N; j=j+i) {
primeList[j]=true;
}
}
for(int i=M; i<=N; i++) {
if(primeList[i]==false) {
System.out.println(i);
}
}
}
}
'Study > [Algorithm]' 카테고리의 다른 글
[백준] 1316번 - 그룹 단어 체커 (0) | 2021.05.30 |
---|---|
[백준] 2941번 - 크로아티아 알파벳 (0) | 2021.05.29 |
[백준] 1152번 JAVA - 단어의 개수 (0) | 2021.05.27 |
[백준] 2577번 JAVA - 숫자의 개수 (0) | 2021.05.21 |
[백준] 1110번 JAVA - 더하기 사이클 (0) | 2021.05.20 |
댓글