기본적인 백트래킹 문제에서 자음과 모음 최소 개수라는 조건이 걸려있는 문제였다. 오랜만에 백트래킹 문제를 풀어보니 조금 헤맸지만 결국 풀이에 성공하였는데 계속 오답이 나왔다.
이유를 알아보니 조건에 "모음"에 만 신경써 "자음" 개수를 생각하지않아 반례로 모음만이 들어갔을때 모음으로만 조합을 하게 된 것이 문제였다.
모음, 자음 개수를 따로 계산해 문제를 해결하였는데 후에 다시 생각해보니 굳이 개수를 따로 저장하지 않아도 해결 할 수 있을거 같다는 생각이 들었다.
#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
int l,c;
string a;
vector<string> passward;
vector<string> mo_list;
vector<string> ja_list;
bool visit[16] = { false };
//vector<char> mo;
int mo = 0;
void backtracking(int ct, int moum, int start, int jaum) {
//현재 카운트가 입력받은 l과 같아 졌을때
if (ct == l && moum < mo_list.size() && jaum>=2) {
for (int i = 0; i < passward.size(); i++) {
if (visit[i] == true) {
cout << passward[i];
}
}
cout << endl;
}
else {
for (int i = start; i < passward.size(); i++) {
//현재 비밀번호가 모음이고 모음을
if ((passward[i] == "a" || passward[i] == "e" || passward[i] == "i" || passward[i] == "o" || passward[i] == "u") && moum > 0) {
visit[i] = true;
backtracking(ct + 1, moum - 1, i+1, jaum);
visit[i] = false;
}
else if ((passward[i] == "a" || passward[i] == "e" || passward[i] == "i" || passward[i] == "o" || passward[i] == "u") && moum == 0) {
continue;
}
else {
visit[i] = true;
backtracking(ct + 1, moum, i+1, jaum + 1);
visit[i] = false;
}
}
}
return;
}
int main() {
cin >> l >> c;
for (int i = 0; i < c; i++) {
cin >> a;
if (a == "a" || a == "e" || a == "i" || a == "o" || a == "u") {
mo_list.push_back(a);
}
else {
ja_list.push_back(a);
}
passward.push_back(a);
}
sort(passward.begin(), passward.end());
backtracking(0, mo_list.size(), 0, 0);
return 0;
}