한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다.
각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요.
dfs
를 이용해서 모든 경우를 찾아주었다.numbers
의 자리수와 같은 숫자까지 모든 경우를 조사한다.set
에 삽입한다.set
을 이용하였다.set
의 크기를 return
한다.set
을 전역변수로 처리했다.#include <iostream>
#include <string>
#include <vector>
#include <set>
using namespace std;
bool visited[7] = {0, };
set<int> s;
bool isPrimeNumber(int n) {
if (n < 2) return false;
for (int i = 2; i*i <= n; ++i) {
if (n % i == 0) return false;
}
return true;
}
void dfs(int targetLength, string numbers, string number ="") {
if (number.size() == targetLength) {
int n = stoi(number);
if (isPrimeNumber(n)) {
s.insert(n);
}
}
else {
for (int i = 0; i < numbers.size(); ++i) {
if (visited[i]) continue;
number += numbers[i];
visited[i] = true;
dfs(targetLength, numbers, number);
number.pop_back();
visited[i] = false;
}
}
}
int solution(string numbers) {
for (int i = 1; i <= numbers.size(); ++i) {
dfs(i, numbers);
}
return s.size();
}