어흥

[백준 3671] 산업 스파이의 편지 (C++) 본문

알고리즘/백준

[백준 3671] 산업 스파이의 편지 (C++)

라이언납시오 2020. 6. 12. 22:10
728x90
반응형

문제 링크: https://www.acmicpc.net/problem/3671

 

3671번: 산업 스파이의 편지

문제 안녕하세요. 저는 산업 스파이입니다. 저의 정체를 절대 다른 사람에게 말하지 말아주세요. 저의 가장 최근 일은 유명한 수학 연구소의 최신 연구 결과를 훔쳐오는 것이었습니다. 저는 매��

www.acmicpc.net

1. 주의할 점

- 소수인 수를 미리 구해놓는다

- 매 TC마다 벡터들을 초기화한다

 

2. 구현

- 에라토스테네스의 체를 이용하여 소수면 Num[] 배열 자기자신을 입력한다

- 1~입력받은 수의 자리수 까지 DFS를 수행하며 구한 수가 소수라면 Set에 넣는다

 

#define MAX 10000000
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <stdlib.h>
#include <set>
#include <math.h>
using namespace std;
int num[MAX], len;
bool check[7];
vector<int> v, ans;
set<int> s;
string str;

void cal() {
	for (int i = 2; i < MAX; i++) 
		num[i] = i;
	for (int i = 2; i <= sqrt(MAX); i++) {
		if (num[i] == 0) continue;
		for (int j = i + i; j < MAX; j += i)
			num[j] = 0;
	}
}

void dfs(int idx, int len) {
	if (idx==len) {
		string ss = "";
		for (int i = 0; i < idx; i++)
			ss += (ans[i]+'0');
		int val = stoi(ss);
		if (num[val] != 0)
			s.insert(val);
		return;
	}

	for (int i = 0; i < str.size(); i++) {
		if (check[i]) continue;
		ans.push_back(v[i]);
		check[i] = true;
		dfs(idx + 1, len);
		ans.pop_back();
		check[i] = false;
	}
}

int main() {
	ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
	cal();
	int test;
	cin >> test;
	for (int t = 0; t < test; t++) {
		v.clear();
		s.clear();
		cin >> str;
		len = str.size();
		for (int j = 0; j < len; j++) {
			check[j] = false;
			int val = str[j] - '0';
			v.push_back(val);
		}
		for (int j = 1; j <= len; j++) {
			ans.clear();
			dfs(0, j);
		}
		cout << s.size() << '\n';
	}
	return 0;
}
728x90
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 6416] 트리인가? (C++)  (0) 2020.06.14
[백준 5639] 이진 검색 트리 (C++)  (0) 2020.06.14
[백준 3967] 매직 스타 (C++)  (0) 2020.06.12
[백준 1342] 행운의 문자열 (C++)  (0) 2020.06.10
[백준 2002] 추월 (C++)  (0) 2020.06.10
Comments