알고리즘/백준

[백준] 19699번 : 소-난다!

코딍코딍 2024. 1. 29. 21:10

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

 

19699번: 소-난다!

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

www.acmicpc.net

 

문제

 

입력

 

출력

 


소스코드

import java.util.*;
import java.io.*;

public class Main {
    static int n, m;
    static int arr[];
    static ArrayList<Integer> al = new ArrayList();

    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());

        arr = new int[n];
        st = new StringTokenizer(br.readLine());

        for (int i = 0; i < n; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }

        backtrack(0, 0, 0);

        Collections.sort(al);
        for (int i : al) {
            System.out.print(i + " ");
        }

        if (al.size() == 0) System.out.print(-1);
    }

    static void backtrack(int x, int sum, int cnt) {
        if (cnt == m) {
            //소수 판별
            for (int i = 2; i <= sum / 2; i++) {
                if (sum % i == 0) return;
            }
            if (!(al.contains(sum))) al.add(sum);
        }

        for (int i = x; i < n; i++) {
            backtrack(i + 1, sum + arr[i], cnt + 1);
        }
    }
}

 

해결 방법

  1. M마리 소들의 몸무게 합으로 만들 수 있는 모든 소수를 구하려면 완전 탐색을 진행해야하고 이때 백트래킹을 사용하였다.
  2. 백트래킹을 할 때 주의점으로 몸무게 합이 소수인 M마리 소들을 택했을 때, 해당 몸무게 합이 이미 리스트에 있다면 저장하지 않아야 한다. 그래야 중복된 값을 출력하지 않는다.