๐ ๋ฌธ์
https://www.acmicpc.net/problem/1153
๋ฐ๋ก ํ์ธ : https://testcase.ac/problems/1153
1153๋ฒ ๋ค ๊ฐ์ ์์ - Testcase AC
๋ฐ๋ก ์ฐพ๊ธฐ ์คํ ํ์11๋ฒ ๋ฐ๋ก ์ฐพ์ ํ์6๋ฒ ์ต๊ทผ 1์ฃผ์ผ ์คํ ํ์3๋ฒ
testcase.ac
๐ ์์ด๋์ด
1. N๋ฏธ๋ง์ ์์๋ฅผ ๋ชจ๋ ๋ฏธ๋ฆฌ ์ฐพ๋๋ค.
2. ๊ณจ๋ ๋ฐํ์ ์ถ์ธก ์ง์๋ ๋๊ฐ์ ์์๋ก ๋ฐ๋์ ํํ ๊ฐ๋ฅํ๋ค. ( ์ฆ, ์ง์ + a + b ์ ์กฐํฉ์ผ๋ก ๋ง๋ ๋ค)
2-1. ์ง์์ธ ๊ฒฝ์ฐ๋ ( 2+2 + (์ง์) ๋ก ๊ฐ๋ฅํ์ง ํ์ธ)
2-2 ํ์ ์ธ ๊ฒฝ์ฐ๋ ( 2+3 +(์ง์)๋ก ๊ฐ๋ฅํ์ง ํ์ธ)
๐ ํ์ด
package ๋ฐฑ์ค.์ํ.์๋ผํ ์คํ
๋ค์ค์์ฒด;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Boj_1153_๋ค๊ฐ์์์ {
private static List<Integer> primes = new ArrayList<>();
private static boolean[] isPrime;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
if (N < 8) {
System.out.println("-1");
return;
}
findPrimes(N);
List<Integer> path = new ArrayList<>();
// ๊ณจ๋๋ฐํ์ ์ถ์ธก ( ์ง์๋ ํญ์ ๋ ์์์ ํฉ์ผ๋ก ํํ์ด ๊ฐ๋ฅํ๋ค => ์ง์๊ฐ ๋๋ฉด ์ฐพ์์ ์์)
if (N % 2 == 0) {
path.add(2);
path.add(2);
N -= 4;
} else {
path.add(2);
path.add(3);
N -= 5;
}
for (int prime : primes) {
int other = N - prime;
if (other >= 2 && isPrime[other]) {
path.add(prime);
path.add(other);
break;
}
}
for (int num : path) {
System.out.print(num + " ");
}
}
private static void findPrimes(int n) {
isPrime = new boolean[n + 1];
Arrays.fill(isPrime, true);
isPrime[0] = isPrime[1] = false;
for (int i = 2; i * i <= n; i++) {
if (isPrime[i]) {
for (int j = i * i; j <= n; j += i) {
isPrime[j] = false;
}
}
}
for (int i = 2; i <= n; i++) {
if (isPrime[i]) {
primes.add(i);
}
}
}
}
๋ ๋น ๋ฅธ ์ฝ๋ ( ์ธ๋ชจ์์ด ์ด์ง ํ์ ๋ฃ๊ธฐ..)
package ๋ฐฑ์ค.์ํ.์๋ผํ ์คํ
๋ค์ค์์ฒด;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class Boj_1153_์์ ์๋ฃ {
private static List<Integer> primes = new ArrayList<>();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
findPrimes(N);
if (N % 2 == 0) {
//์ง์
if (findDfs(N - 4, 2, new ArrayList<>(List.of(2, 2)))) {
return;
}
} else if (N != 1) {
//ํ์ (ํ๋๋ ์ง์์ฌ์ผ ํ๋ค - 2๊ฐ ํฌํจ)
if (findDfs(N - 5, 2, new ArrayList<>(List.of(2, 3)))) {
return;
}
}
System.out.println("-1");
}
private static boolean findDfs(int n, int depth, List<Integer> path) {
if (path.size() > 4)
return false;
if (depth == 0) {
if (path.size() == 4 && n == 0) {
for (Integer number : path) {
System.out.print(number + " ");
}
return true;
}
return false;
}
for (int i = upperBound(n); 0 <= i; i--) {
path.add(primes.get(i));
//์ฐพ์
if (findDfs(n - primes.get(i), depth - 1, path)) {
return true;
}
path.remove(path.size() - 1);
}
return false;
}
private static int upperBound(int n) {
int start = 0;
int end = primes.size() - 1;
int upperBound = 0;
while (start <= end) {
int mid = start + (end - start) / 2;
if (primes.get(mid) <= n) {
start = mid + 1;
upperBound = mid;
} else {
end = mid - 1;
}
}
return upperBound;
}
private static void findPrimes(int n) {
boolean[] isNotPrime = new boolean[n + 1];
isNotPrime[0] = isNotPrime[1] = true;
for (int i = 1; i <= n; i++) {
if (!isNotPrime[i]) {
primes.add(i);
for (int j = i; j <= n; j += i) {
isNotPrime[j] = true;
}
}
}
}
}
'๋ฐฑ์ค(boj)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JAVA]1111 IQ ํ ์คํธ (0) | 2025.04.14 |
---|---|
[JAVA]16947 ์์ธ ์งํ์ฒ 2ํธ์ (0) | 2025.04.13 |
[JAVA]1377 ๋ฒ๋ธ ์ํธ, ์ ๋ ฌ (0) | 2025.04.12 |
[JAVA]11437 LCA ๊ณตํต ๋ถ๋ชจ ๋ ธ๋ ์ฐพ๊ธฐ(๊ณจ๋ 3) (0) | 2023.09.20 |
[JAVA]13418 ํ๊ต ํ๋ฐฉํ๊ธฐ, ๊ณจ๋ 3 (0) | 2023.08.21 |