groti's blog

[BOJ] 3671 - 산업 스파이의 편지 본문

알고리즘/BOJ 문제 풀이

[BOJ] 3671 - 산업 스파이의 편지

groti 2019. 12. 8. 21:49

1. 문제 해석

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

 

3671번: 산업 스파이의 편지

문제 안녕하세요. 저는 산업 스파이입니다. 저의 정체를 절대 다른 사람에게 말하지 말아주세요. 저의 가장 최근 일은 유명한 수학 연구소의 최신 연구 결과를 훔쳐오는 것이었습니다. 저는 매우 유능한 산업 스파이이기 때문에, 연구 결과를 어렵지 않게 얻을 수 있었습니다. 하지만, 제가 올 것을 미리 알았는지 연구소에서는 연구 결과를 모두 서류 절단기에 넣어버렸습니다. 어쩔수 없이 저는 눈물을 머금고 종이 조각을 모두 훔쳐왔습니다. 저를 고용한 사람은 매우 무

www.acmicpc.net

  • 최소 1개, 최대 7개의 숫자가 주어진다.
  • 숫자를 적절하게 배치하여 만들 수 있는 소수의 개수를 구해야 한다.
  • 주어진 수 중에 일부만 사용해도 된다. 만들어진 수가 0으로 시작할 경우 0을 지운다.

 

2. 접근방법

최대 7개의 수가 주어지기 때문에 만들 수 있는 조합의 개수는 7!이다. 조합으로 만들어진 수가 소수인지 판단하여 카운팅 해주면 될 것이다.

  • 에라토스테네스의 체를 이용하여 7자리까지 만들 수 있는 소수를 배열 chk에 모두 체크해 둔다.
  • 재귀함수를 이용하여 주어진 수를 조합한 수 num을 만든다.
  • 만들어진 수 num이 chk[num] == true를 만족한다면 소수 개수를 카운팅 한다.

 

3. 주의할 점

  • 여러 개의 테스트 케이스가 주어지기 때문에 초기화해야 할 것들을 생각해야 한다.
  • 11과 011은 같은 수이다. 

 

4. 소스코드

#include <iostream>
#include <string>
#include <set>

using namespace std;

int a[10];
int aSize;
int ans;
set<int> numSet;
bool vis[10];
bool chk[10000000];

void init(string str) {
	aSize = str.size();
	for (int i = 0; i < str.size(); i++) {
		a[i] = str[i] - '0';
	}
	for (int i = 0; i < 10; i++) vis[i] = false;
}

void sol(int num) {
	if (num > 1) {
		if (!chk[num]) {
			if (numSet.find(num) == numSet.end()) {
				numSet.insert(num);
				ans++;
			}
		}
	}

	for (int i = 0; i < aSize; i++) {
		if (!vis[i]) {
			vis[i] = true;
			sol(num * 10 + a[i]);
			vis[i] = false;
		}
	}
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);

	// 소수
	for (int k = 2; k * k < 10000000; k++) {
		if (chk[k]) continue;
		for (int i = k * k; i < 10000000; i += k) {
			chk[i] = true;
		}
	}

	int T;
	cin >> T;
	while (T--) {
		string str;
		cin >> str;
		init(str);
		numSet.clear();
		ans = 0;
		sol(0);
		cout << ans << '\n';
	}

	return 0;
}

'알고리즘 > BOJ 문제 풀이' 카테고리의 다른 글

[BOJ] 18116 - 로봇 조립  (0) 2019.12.18
[BOJ] 18115 - 카드 놓기  (0) 2019.12.14
[BOJ] 18113 - 그르다 김가놈  (0) 2019.12.08
[BOJ] 18114 - 블랙 프라이데이  (0) 2019.12.08
[BOJ] 1450 - 냅색문제  (0) 2019.12.08
Comments