https://www.acmicpc.net/problem/9020
9020번: 골드바흐의 추측
1보다 큰 자연수 중에서 1과 자기 자신을 제외한 약수가 없는 자연수를 소수라고 한다. 예를 들어, 5는 1과 5를 제외한 약수가 없기 때문에 소수이다. 하지만, 6은 6 = 2 × 3 이기 때문에 소수가 아
www.acmicpc.net
주의점
- 2보다 큰 짝수에 대한 소수의 합 구하기
- 소수의 합이 여러 개일 때, 두 소수의 차이가 작은 경우 출력
- 두 소수 중 작은 수부터 출력
알고리즘
- 에라토스테네스의 체 활용
짝수 n에 대한 두 소수 구하기 + 두 소수의 차가 작은 경우 출력
- 예시
n = 14
n = p + q (p와 q는 소수)
14 = 7 + 7
14 = 3 + 11
➡ 두 소수의 차가 작은 7 7 출력해야
- 방법
짝수 n 절반으로 나누기
n = p + q (p와 q는 소수)
p와 q가 소수가 아니면 p는 1 감소, q는 1 증가시키기
(p와 q가 소수일 때까지 반복)
p | q | n = p + q | True / False |
8 | 8 | 16 | False |
7 | 9 | 16 | False |
6 | 10 | 16 | False |
5 | 11 | 16 | True |
4 | 12 | 16 | False |
3 | 13 | 16 | True |
2 | 14 | 16 | False |
풀이
1. Scanner
import java.util.Scanner;
public class Main {
//false: 소수, range: 0 ~ 10000
public static boolean[] prime = new boolean[10001];
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
get_prime();
int T = in.nextInt(); //테스트 케이스
while(T-- > 0) {
int n = in.nextInt();
int p = n / 2;
int q = n / 2;
while(true) {
//두 파티션이 모두 소수일 경우
if(!prime[p] && !prime[q]) {
System.out.println(p + " " + q);
break;
}
p--;
q++;
}
}
}
//에라토스테네스의 체
public static void get_prime() {
prime[0] = prime[1] = true;
for(int i = 2; i <= Math.sqrt(prime.length); i++) {
if(prime[i]) {
continue;
}
for(int j = i * i; j < prime.length; j += i) {
prime[j] = true;
}
}
}
}
2. BufferedReader
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
//false: 소수, range: 0 ~ 10000
public static boolean[] prime = new boolean[10001];
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
get_prime();
int T = Integer.parseInt(br.readLine()); //테스트 케이스
while(T-- > 0) {
int n = Integer.parseInt(br.readLine());
int p = n / 2;
int q = n / 2;
while(true) {
// 두 파티션이 모두 소수일 경우
if(!prime[p] && !prime[q]) {
System.out.println(p + " " + q);
break;
}
p--;
q++;
}
}
}
//에라토스테네스의 체
public static void get_prime() {
prime[0] = prime[1] = true;
for(int i = 2; i <= Math.sqrt(prime.length); i++) {
if(prime[i]) {
continue;
}
for(int j = i * i; j < prime.length; j += i) {
prime[j] = true;
}
}
}
}
3. BufferedReader + StringBuilder
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
//false: 소수, range: 0 ~ 10000
public static boolean[] prime = new boolean[10001];
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
get_prime();
int T = Integer.parseInt(br.readLine()); //테스트 케이스
while(T-- > 0) {
int n = Integer.parseInt(br.readLine());
int p = n / 2;
int q = n / 2;
while(true) {
//두 파티션이 모두 소수일 경우
if(!prime[p] && !prime[q]) {
sb.append(p).append(' ').append(q).append('\n');
break;
}
p--;
q++;
}
}
System.out.print(sb);
}
// 에라토스테네스의 체
public static void get_prime() {
prime[0] = prime[1] = true;
for(int i = 2; i <= Math.sqrt(prime.length); i++) {
if(prime[i]) {
continue;
}
for(int j = i * i; j < prime.length; j += i) {
prime[j] = true;
}
}
}
}
성능
- BufferedReader + StringBuilder
- BufferedReader
- Scanner
'Algorithm > Baekjoon' 카테고리의 다른 글
[백준] 3009번 : 네 번째 점 - Java (0) | 2022.03.31 |
---|---|
[백준] 1085번 : 직사각형에서 탈출 - Java (0) | 2022.03.30 |
[백준] 4948번 : 베르트랑 공준 - Java (0) | 2022.03.29 |
[백준] 1929번 : 소수 구하기 - Java (0) | 2022.03.29 |
[백준] 11653번 : 소인수분해 - Java (0) | 2022.03.28 |
댓글