https://school.programmers.co.kr/learn/courses/30/lessons/42839
numbers 문자열의 크기가 7 이하이므로 브루트포스로 문제를 해결하려고 했고, 연습삼아 next_permutation을 사용해 순열, 그리고 DFS로 두 번 풀이해보았다.
두 방법 모두, 모든 수의 조합을 시도하며 각 수가 소수인지 판단하여 unordered_set에 넣어 중복된 숫자를 제거하였다.
✅ 순열을 이용한 풀이
#include <string>
#include <vector>
#include <unordered_set>
#include <cmath>
#include <algorithm>
using namespace std;
bool isprimenum(const string& str)
{
int num = stoi(str);
for (int i = 2; i <= sqrt(num); ++i)
{
if (num % i == 0) return false;
}
return true;
}
int solution(string numbers)
{
unordered_set<int> prime_num;
sort(numbers.begin(), numbers.end());
do
{
for (int len = 1; len <= numbers.length(); ++len)
{
string str = numbers.substr(0, len);
if (stoi(str) < 2) continue;
if (prime_num.find(stoi(str)) == prime_num.end())
{
if (isprimenum(str)) prime_num.insert(stoi(str));
}
}
} while (next_permutation(numbers.begin(), numbers.end()));
return prime_num.size();
}
✅ DFS를 이용한 풀이
#include <string>
#include <vector>
#include <unordered_set>
#include <cmath>
using namespace std;
bool isprimenum(const string& str)
{
int num = stoi(str);
if (num < 2) return false;
for (int i = 2; i <= sqrt(num); ++i)
{
if (num % i == 0) return false;
}
return true;
}
void DFS(const string& numbers, string str, unordered_set<int>& prime_num, vector<bool>& used)
{
if (!str.empty())
{
if (isprimenum(str)) prime_num.insert(stoi(str));
}
for (int i = 0; i < numbers.length(); ++i)
{
if (used[i]) continue;
used[i] = true;
DFS(numbers, str + numbers[i], prime_num, used);
used[i] = false;
}
}
int solution(string numbers)
{
unordered_set<int> prime_num;
vector<bool> used(numbers.length(), false);
DFS(numbers, "", prime_num, used);
return prime_num.size();
}
'공부 > Code Cata' 카테고리의 다른 글
택배 상자 / stack (0) | 2025.04.24 |
---|---|
쿼드압축 후 개수 세기 / 재귀 (0) | 2025.04.24 |
가장 큰 수 / 정렬 (0) | 2025.04.23 |
다리를 지나는 트럭 / 큐 (0) | 2025.04.23 |
숫자 변환(BFS) (0) | 2025.04.11 |