정화 코딩

[C++] 소-난다! (백준 19699번) 본문

PS

[C++] 소-난다! (백준 19699번)

jungh150c 2024. 9. 3. 03:17

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

 

#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;

bool p[10000];
int n, m;
vector<int> h;
vector<bool> chk;
set<int> ans;

void dfs(int idx, int res) {
    if (idx == m) {
        if (res < 10000 && p[res]) ans.insert(res);
        return;
    }
    for (int i = 0; i < n; i++) {
        if (!chk[i]) {
            chk[i] = 1;
            dfs(idx + 1, res + h[i]);
            chk[i] = 0;
        }
    }
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    fill_n(p, 10000, 1);
    p[0] = p[1] = 0;

    for (int i = 2; i < 5000; i++) {
        int tmp = i * 2;
        while (tmp < 10000) {
            p[tmp] = 0;
            tmp += i;
        }
    }

    cin >> n >> m;
    h = vector<int>(n);
    chk = vector<bool>(n, false);
    for (int i = 0; i < n; i++) cin >> h[i];
    sort(h.begin(), h.end());

    dfs(0, 0);
    if (ans.empty()) {
        cout << -1 << '\n';
    } else {
        for (int x: ans) cout << x << ' ';
        cout << '\n';
    }
}

우선 에라토스테네스 체로 1부터 10000까지 범위에서 소수를 찾았다. 그 후 dfs를 통해 가능한 모든 합들을 살펴보면서 소수인지 아닌지 체크한다. 소수가 중복되면 안 되기 때문에 ans를 set으로 하였고, C++에서 set은 알아서 오름차순 정렬해주기 때문에 그대로 출력했다. (AC)

 

'PS' 카테고리의 다른 글

[C++] 비트가 넘쳐흘러 (백준 17419번)  (0) 2024.09.07
[C++] 카잉 달력 (백준 6064번)  (0) 2024.09.03
[C++] IOIOI (백준 5525번)  (2) 2024.09.03
[C++] DSLR (백준 9019번)  (0) 2024.08.07
[C++] 과일 탕후루 (백준 30804번)  (0) 2024.08.07
Comments