주어진 C개의 알파벳들로 L자리 암호를 만들면 되는 문제였다.
조건이 몇개 더 있는데
1. 모음 1개 이상,자음 2개 이상
2. 오름 차순 정렬
3. 중복 X
백트레킹으로 조합을 뽑아서 1번 조건을 체크해주고 출력을 하면 된다.
오름 차순 정렬이므로 조합을 뽑기 전에 미리 정렬을 해주었다. 그리고 백트레킹 함수에서 i를 index로 해주어서
이미 뽑힌 알파벳보다 더 뒤에 있는 알바벳만 추가될 수 있게 해주었다.
#include<iostream>
#include<algorithm>
using namespace std;
int L, C,cntV;
char alpa[15];
bool check[15];
char temp;
//0~26
// 뽑는다 (오름차순)/ 개수 체크
char ans[15];
void backtracking(int depth,int index)
{
if (depth == L)
{
cntV = 0;
for (int i = 0; i < L; i++)
{
if (ans[i] == 'a' || ans[i] == 'e' || ans[i] == 'i' || ans[i] == 'o' || ans[i] == 'u')
cntV++;
}
if (cntV < 1 || L - cntV < 2)
return;
for (int i = 0; i < L; i++)
cout << ans[i];
cout << "\n";
return;
}
for (int i = index; i < C; i++)
{
if (!check[i])
{
check[i] = true;
ans[depth]= alpa[i];
temp = alpa[i];
backtracking(depth + 1,i+1);
check[i] = false;
}
}
}
int main()
{
cin >> L >> C;
for (int i = 0; i < C; i++)
{
cin >> alpa[i];
}
sort(alpa,alpa+C);
backtracking(0,0);
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준]1107 리모컨 c++ (0) | 2022.08.04 |
---|---|
[백준] 10971 외판원 순회 2 c++ (0) | 2022.08.04 |
[백준] 2503 숫자야구 c++ (0) | 2022.07.08 |
[백준] 1780 종이의 개수 (0) | 2022.06.04 |
[백준] 2839설탕배달 c++ (0) | 2022.05.28 |