[백준] 19699: 소-난다! - JAVA
https://www.acmicpc.net/problem/19699
풀이
소 M마리의 합이 소수인지 판별하는 문제였다.
N마리의 소가 있다. N마리 중 M마리의 조합을 만들어 소수인지 판별해주었다.
소수는 에라토스테네스의 체를 구현하여 미리 배열에 정보를 담아놓았다.
오름차순으로 출력과 중복 제거를 위해 TreeSet을 이용했고, Set출력을 위해 Stream을 이용했다.
메모리: 14296KB
시간: 128ms
언어: Java 11
코드
import java.io.*;
import java.util.*;
public class Main {
static int N, M;
static int[] cow, group;
static boolean[] prime;
static TreeSet<Integer> ans;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
cow = new int[N];
int sum = 0;
st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
cow[i] = Integer.parseInt(st.nextToken());
sum += cow[i];
}
prime = new boolean[sum + 1];
prime[0] = prime[1] = true;
for (int i = 2; i * i <= sum; i++) {
if (!prime[i]) {
for (int j = i * i; j <= sum; j += i) {
prime[j] = true;
}
}
}
ans = new TreeSet<>();
group = new int[M];
makeGroup(0, 0);
if (ans.size() != 0) {
ans.stream().forEach(num -> System.out.print(num + " "));
} else {
System.out.println(-1);
}
}
private static void makeGroup(int cnt, int idx) {
if (cnt == M) {
int sum = 0;
for (int i = 0; i < M; i++) {
sum += group[i];
}
if (!prime[sum]) {
ans.add(sum);
}
return;
}
for (int i = idx; i < N; i++) {
group[cnt] = cow[i];
makeGroup(cnt + 1, i + 1);
}
}
}