OJ

[BOJ] 19699 소-난다! (JAVA)

P3PP4 2023. 4. 20. 10:00

https://www.acmicpc.net/problem/19699

 

19699번: 소-난다!

지난 번 헛간 청약의 당첨우(牛)가 발표됐다. 청약에 당첨된 소들은 날아갈 듯이 기뻐하다가 진짜로 하늘을 날았다. 하지만 이후로 소들은 날 수 없었다. 그러던 어느 날, 꿀벌에게 쏘이면 잠깐

www.acmicpc.net

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

public class Main {
	
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static StringBuilder sb = new StringBuilder();
    static StringTokenizer st;
    static int N, M;
    static int[] input;
    static boolean[] notPrime;
    static PriorityQueue<Integer> pq = new PriorityQueue<>();

    public static void main(String[] args) throws Exception {

        notPrime = new boolean[10000];
        for (int i = 2; i < 10000; i++) {
            if (!notPrime[i]) {
                for (int j = i * 2; j < 10000; j += i) {
                    notPrime[j] = true;
                }
            }
        } // sieve of Eratosthenes

        st = new StringTokenizer(br.readLine(), " ");
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
        input = new int[N];
        st = new StringTokenizer(br.readLine(), " ");
        for (int i = 0; i < N; i++) {
            input[i] = Integer.parseInt(st.nextToken());
        }

        check(0, 0, 0);

        if (pq.size() == 0) sb.append(-1);
        else {
            int pre = 0;
            while (!pq.isEmpty()) {
                int now = pq.poll();
                if (now == pre) continue;
                sb.append(now).append(" ");
                pre = now;
            }
        }

        System.out.print(sb);

    }

    static void check(int start, int sum, int cnt) {
        if (cnt == M) {
            if (!notPrime[sum]) pq.offer(sum);
            return;
        }

        for (int i = start; i < N; i++) {
            check(i + 1, sum + input[i], cnt + 1);
        }
    }
	
}