알고리즘 연습
[4948번] 베르트랑 공준 - Java
밀깜
2021. 11. 17. 21:22
https://www.acmicpc.net/problem/4948
4948번: 베르트랑 공준
베르트랑 공준은 임의의 자연수 n에 대하여, n보다 크고, 2n보다 작거나 같은 소수는 적어도 하나 존재한다는 내용을 담고 있다. 이 명제는 조제프 베르트랑이 1845년에 추측했고, 파프누티 체비쇼
www.acmicpc.net
1. 배운점
- 에라토스테네스의 체를 이용해 소수를 빠르게 구할 수 있다.
2. 개선할 점
3. 궁금한 점
4. 풀이
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class N_4948_베르트랑공준 {
private static int primeSet(int number) {
// 1인 경우 1을 return
if(number < 2){
return 1;
}
// number * 2 만큼 배열 생성
int [] primeArr = new int [number * 2 + 1];
for(int i = 0; i < number * 2; i ++) {
primeArr[i] = 1; // 배열 값 1로 초기화
}
// 에라토스테네스의 체 활용하기
primeArr[0] = primeArr[1] = 0;
for(int i = 2; i * i < number * 2; i++) {
if (primeArr[i] == 0) continue;
for(int j = i * i; j < primeArr.length; j += i) {
primeArr[j] = 0;
}
}
// count = 0에서 시작
int count = 0;
// n보다 크고 2n 이하인 소수 개수 세기
for(int i = number + 1 ; i < number * 2; i++) {
if(primeArr[i] != 0) {
count++;
}
}
return count;
}
public static void main(String[] args) throws NumberFormatException, IOException {
// import java.io.BufferedReader
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 입력이 0이 될 때까지 반복
int caseNum = -1;
while(true) {
// 테스트 케이스 받기
caseNum = Integer.parseInt(br.readLine());
if(caseNum == 0) break;
// 메서드에 대입
int primeCount = primeSet(caseNum);
// 결과 출력
System.out.println(primeCount);
}
}
}