Level 2. 소수 찾기
뭔가 복잡한 코드를 짜서 어딘가에선 오류가 발생할 줄 알았는데, 바로 통과해서 당황했다.
next_permutation() 함수와 비트 마스킹을 활용해 순열과 조합을 만들었다.
#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
#include <cmath>
#include <string>
using namespace std;
vector<vector<char>> C(vector<char>& v, int n, int r)
{
set<vector<char>> st;
vector<int> bitMask(n, 0);
fill(bitMask.end() - r, bitMask.end(), 1);
do
{
vector<char> t;
for (auto it = find(bitMask.begin(), bitMask.end(), 1); it != bitMask.end(); it = find(++it, bitMask.end(), 1))
t.emplace_back(v[it - bitMask.begin()]);
sort(t.begin(), t.end());
st.emplace(t);
} while (next_permutation(bitMask.begin(), bitMask.end()));
return vector<vector<char>>(st.begin(), st.end());
}
bool is_prime(int num)
{
float last = sqrt(num);
for (int i = 2; i <= last; ++i)
if (num % i == 0)
return false;
return 1 < num;
}
int solution(string numbers)
{
set<int> st;
vector<char> v(numbers.begin(), numbers.end());
for (int r = 1; r <= v.size(); ++r)
{
for (vector<char>& comb : C(v, v.size(), r))
{
do
{
int num = stoi(string(comb.begin(), comb.end()));
if (is_prime(num))
st.emplace(num);
}
while (next_permutation(comb.begin(), comb.end()));
}
}
return st.size();
}
'자료구조 & 알고리즘 > 프로그래머스' 카테고리의 다른 글
Level 2. 행렬 테두리 회전하기 (0) | 2023.06.09 |
---|---|
Level 0. 수열과 구간 쿼리 4 (1) | 2023.06.08 |
Level 2. 땅따먹기 (0) | 2023.06.06 |
Level 2. 주식가격 (0) | 2023.06.05 |
Level 2. [3차] 압축 (0) | 2023.06.04 |