Java/코딩 테스트
수학: 백준 6588 자바(Java) 골드바흐의 추측
bgeun2
2021. 10. 13. 20:02
반응형
문제: https://www.acmicpc.net/problem/6588
6588번: 골드바흐의 추측
각 테스트 케이스에 대해서, n = a + b 형태로 출력한다. 이때, a와 b는 홀수 소수이다. 숫자와 연산자는 공백 하나로 구분되어져 있다. 만약, n을 만들 수 있는 방법이 여러 가지라면, b-a가 가장 큰
www.acmicpc.net
풀이:
주어진 짝수를 두 홀수 소수의 합으로 나타내는 문제이다.
n = a + b 형태로 출력하는데 n을 만드는 방법 중 b - a 가 가장 큰 수를 출력하라 했으므로 n을 1씩
마이너스해가면서 소수인 경우를 찾고, 소수라면 n - b = a 식을 통해 찾은 a도 소수인지 확인한다.
만족한다면, StringBuilder sb에 추가하고 n = a + b를 만족하는 소수 조합이 없다면 문제에서 제시한
문자열을 sb에 추가한다.
n을 -1 하면서 소수 조합을 찾기 때문에 먼저 찾은 조합이 b - a 가 가장 큰 조합이 된다.
2번의 시간 초과가 발생했는데, 소수 찾는 알고리즘을 보다 효율적인 알고리즘으로 바꾸어 해결했다.
모든 수를 확인할 필요는 없기 때문에 해당 숫자의 √N까지만 확인하는 방법이다.
정답:
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.util.StringTokenizer;
public class Main {
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while (true) {
int n = Integer.parseInt(br.readLine());
if (n == 0) {
break;
}
goldbach(n);
}
System.out.println(sb);
}
public static void goldbach(int number) {
for (int i = number; i > 0; i--) {
if (isPrime(i) == true) {
int temp = number - i;
if (isPrime(temp) == true) {
sb.append(number).append(" = ").append(temp).append(" + ").append(i).append('\n');
return;
}
}
}
sb.append("Goldbach's conjecture is wrong.");
return;
}
public static boolean isPrime(int number) {
if (number < 2)
return false;
for (int i = 2; i * i <= number; i++) {
if (number % i == 0)
return false;
}
return true;
}
}
반응형