#include <bits/stdc++.h>
using namespace std;
int L, C;
vector<char> alpha;
vector<char> password;
void Func(int start, int length)
{
if (length == L)
{
int count1 = 0; // 모음 개수
int count2 = 0; // 자음 개수
string s;
for (char c : password)
{
s += c;
if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u')
{
count1++;
}
else
{
count2++;
}
}
if (count1 >= 1 && count2 >= 2)
{
cout << s << '\n';
}
return;
}
for (int i = start; i < C; i++)
{
password.push_back(alpha[i]);
Func(i + 1, length + 1);
password.pop_back();
}
}
int main()
{
cin >> L >> C;
for (int i = 0; i < C; i++)
{
char c;
cin >> c;
alpha.push_back(c);
}
sort(alpha.begin(), alpha.end());
Func(0, 0);
return 0;
}
재귀를 이용한 조합 만들기 문제이다
처음에 암호로 사용했을 법한 문자의 종류들을 alpha
벡터에 추가 후 정렬된 문자열을 선호하니 오름차순해준다
그리고 Func(start, length)
함수를 호출해 alpha
벡터의 0번째부터 C번째까지 한 문자씩 선택하며 password
벡터에 데이터를 추가했다가 백트래킹으로 제거한다
password
의 길이가 L이되면 꺼내보면서 조건을 확인하고 조건에 맞으면 출력한다