알고리즘 문제풀이
[백준/BOJ] 백준 1759번 : 암호 만들기
GeniusJo
2021. 2. 28. 19:34
1759번: 암호 만들기
첫째 줄에 두 정수 L, C가 주어진다. (3 ≤ L ≤ C ≤ 15) 다음 줄에는 C개의 문자들이 공백으로 구분되어 주어진다. 주어지는 문자들은 알파벳 소문자이며, 중복되는 것은 없다.
www.acmicpc.net
Solve(int before_select, int mo, int ja, string maked)함수(before_select:이전에 확인한 인덱스, mo:모음의 개수, ja:자음의 개수, maked:만들어지는 문자열)를 통해 문자열을 만들어 가며 길이가 L인 문자열이 만들어졌을 때 모음, 자음 조건을 만족했는지 확인하여 문제를 해결했다.
코드
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
int L, C;
vector<char> temp;
vector<string> result;
//before_select:이전에 확인한 인덱스, mo:모음의 개수, ja:자음의 개수, maked:만들어지는 문자열
void Solve(int before_select, int mo, int ja, string maked)
{
if (maked.size() == L)
{
if (mo >= 1 && ja >= 2) //모음, 자음 조건을 만족했을때
result.push_back(maked);
else
return;
}
for (int i = before_select + 1; i < temp.size(); i++)
{
char this_char = temp[i];
//모음일때
if (this_char == 'a' || this_char == 'e' || this_char == 'i' || this_char == 'o' || this_char == 'u')
{
Solve(i, mo + 1, ja, maked + this_char);
}
//자음일때
else
{
Solve(i, mo, ja + 1, maked + this_char);
}
}
}
int main()
{
cin.tie(NULL);
ios_base::sync_with_stdio(false);
cin >> L >> C;
for (int i = 0; i < C; i++)
{
char input;
cin >> input;
temp.push_back(input);
}
//알파벳이 암호에서 증가하는 순서로 배열되어 있으므로 정렬한다
sort(temp.begin(), temp.end());
Solve(-1, 0, 0, "");
for (int i = 0; i < result.size(); i++)
cout << result[i] << "\n";
return 0;
}