https://www.acmicpc.net/problem/9020
9020번: 골드바흐의 추측
1보다 큰 자연수 중에서 1과 자기 자신을 제외한 약수가 없는 자연수를 소수라고 한다. 예를 들어, 5는 1과 5를 제외한 약수가 없기 때문에 소수이다. 하지만, 6은 6 = 2 × 3 이기 때문에 소수가 아
www.acmicpc.net


문제의 요구사항을 살펴보자.
(1) 중복이 허용되고
(2) 값 차이가 가장 작은
(3) 두 소수를 사용하여
(4) N을 조합하기
이다.
(3)과 (4)을 위해, N 이하의 소수들이 필요하다.
그래서 효율적으로 소수를 구할 수 있는 에라토스테네스의 체를 이용하기로 결심했다.
그런데 에라토스테네스의 체는 소수가 아닌 수까지 들어가 있다.
public static int[] getEratosthenes(int n) {
int[] prime = new int[n + 1];
for (int i = 2; i <= n; i++) prime[i] = i;
for (int i = 2; i <= Math.sqrt(n); i++) {
if (prime[i] == 0) continue;
for (int j = i + i; j <= n; j += i) {
prime[j] = 0;
}
}
return prime;
}
이로써 (3)은 만족되었다.
import java.io.*;
import java.util.Arrays;
public class Main {
public static int[] isPrime(int n) {
int[] prime = new int[n + 1];
for (int i = 2; i <= n; i++) prime[i] = i;
for (int i = 2; i <= Math.sqrt(n); i++) {
if (prime[i] == 0) continue;
for (int j = i + i; j <= n; j += i) {
prime[j] = 0;
}
}
return Arrays.stream(prime).filter(value -> value != 0).toArray();
}
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int t = Integer.parseInt(bf.readLine());
for (int i = 0; i < t; i++) {
int n = Integer.parseInt(bf.readLine()), x = 0, y = 0;
int min = n;
int[] prime = isPrime(n);
for (int j = 0; j < prime.length; j++) {
for (int k = j; k < prime.length; k++) {
if (prime[j] + prime[k] == n) {
if (Integer.max(prime[j], prime[k]) - Integer.min(prime[j], prime[k]) <= min) {
x = prime[j];
y = prime[k];
}
}
}
}
sb.append(x).append(' ').append(y).append('\n');
}
System.out.println(sb);
}
}

public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int t = Integer.parseInt(bf.readLine());
for (int i = 0; i < t; i++) {
int n = Integer.parseInt(bf.readLine()), min = n, x = 0, y = 0;
int[] prime = isPrime(n);
for (int j = 0; j < prime.length; j++) {
if (min == 0) break;
for (int k = j; k < prime.length; k++) {
if (min == 0) break;
if (prime[j] + prime[k] == n) {
if (Integer.max(prime[j], prime[k]) - Integer.min(prime[j], prime[k]) <= min) {
x = prime[j];
y = prime[k];
min = y - x;
}
}
}
}
sb.append(x).append(' ').append(y).append('\n');
}
System.out.println(sb);
}

import java.io.*;
public class Main {
public static boolean[] isPrime(int n) {
boolean[] prime = new boolean[n + 1];
for (int i = 2; i <= n; i++) prime[i] = true;
for (int i = 2; i <= Math.sqrt(n); i++) {
if (!prime[i]) continue;
for (int j = i + i; j <= n; j += i) {
prime[j] = false;
}
}
return prime;
}
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int t = Integer.parseInt(bf.readLine());
for (int i = 0; i < t; i++) {
int n = Integer.parseInt(bf.readLine()), x = 0, y = 0;
boolean[] prime = isPrime(n);
int part1 = prime.length / 2, part2 = prime.length / 2;
for (int j = 0; j <= prime.length; j++) {
if (prime[part1] && prime[part2]) {
if (part1 + part2 == n) {
sb.append(part1).append(' ').append(part2).append('\n');
break;
}
}
part1--;
part2++;
}
}
System.out.println(sb);
}
}

import java.io.*;
public class Main {
public static int MAX = 10000;
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
boolean[] prime = new boolean[MAX + 1];
for (int i = 2; i <= MAX; i++) prime[i] = true;
for (int i = 2; i <= Math.sqrt(MAX); i++) {
if (!prime[i]) continue;
for (int j = i + i; j <= MAX; j += i) {
prime[j] = false;
}
}
int t = Integer.parseInt(bf.readLine());
for (int i = 0; i < t; i++) {
int n = Integer.parseInt(bf.readLine());
int part1 = n / 2, part2 = n / 2;
for (int j = 0; j <= n; j++) {
if (prime[part1] && prime[part2]) {
if (part1 + part2 == n) {
sb.append(part1).append(' ').append(part2).append('\n');
break;
}
}
part1--;
part2++;
}
}
System.out.println(sb);
}
}

'1Day 1Algo' 카테고리의 다른 글
[백준/BOJ] 14620번 : 꽃길 - Java(자바) (0) | 2022.03.17 |
---|---|
[백준/BOJ] 1931번 : 회의실 배정 - Java(자바) (0) | 2022.03.04 |
[1Day 1Algo] 백준 3986번 좋은 단어 (JAVA) (0) | 2022.01.20 |
[1Day 1Algo] 백준 1065번 한수 (JAVA) (0) | 2022.01.10 |
[1Day 1Algo] 백준 1110번 더하기 사이클 (Python) (0) | 2022.01.05 |