https://www.acmicpc.net/problem/3671
#문제 간단 정리
소수판별 + 구현문제
#문제 해결 방법
우선 숫자가 주어지면 이 숫자로 만들수 있는 조합으로
만들수 있는 소수이니
숫자로 만드는조합 -> dfs 사용
소수판별 -> 에라토스테네스의 체
이렇게 두가지 구현하면 된다
dfs구현에서 최대길이가 7자리수라 시간복잡도에는 문제 없는 것을 알 수 있다.
#전체 코드
#include <iostream>
#include <vector>
#include <string>
#include <set>
using namespace std;
static const int MAX = 10'000'000;
bool primeArr[MAX];
set<int> primeSet;
string s;
set<int> madeNumbers;
void sieveOfEratosthenes() {
primeArr[0] = false;
primeArr[1] = false;
for (int i = 2; i < MAX; i++) {
primeArr[i] = true;
}
for (int i = 2; i * i < MAX; i++) {
if (primeArr[i]) {
for (int j = i * i; j < MAX; j += i) {
primeArr[j] = false;
}
}
}
}
void dfs(string& input, vector<bool>& used, int length) {
if ((int)input.size() == length) {
int num = stoi(input);
madeNumbers.insert(num);
return;
}
for (int i = 0; i < (int)s.size(); i++) {
if (!used[i]) {
used[i] = true;
input.push_back(s[i]);
dfs(input, used, length);
input.pop_back();
used[i] = false;
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
sieveOfEratosthenes();
int t;
cin >> t;
while (t--) {
cin >> s;
madeNumbers.clear();
for (int len = 1; len <= (int)s.size(); len++) {
vector<bool> used(s.size(), false);
string tmp;
dfs(tmp, used, len);
}
int Pcount = 0;
for (int num : madeNumbers) {
if (primeArr[num]) {
Pcount++;
}
}
cout << Pcount << "\n";
}
return 0;
}
'[백준] > C++' 카테고리의 다른 글
백준 11815번 짝수?홀수? [C++] (0) | 2025.01.01 |
---|---|
백준 3005번 크로스워드 퍼즐 찾아보기 [C++] (0) | 2025.01.01 |
백준 32864번 지나칠 수 없는 지하철 게임 [C++] (0) | 2024.12.18 |
백준 24508번 나도리팡 [C++] (0) | 2024.12.15 |
백준 16970번 정수 좌표의 개수 [C++] (0) | 2024.12.14 |