전공/알고리즘
백준 1759(암호 만들기)
xkdlaldfjtnl
2020. 10. 5. 16:05
1759번: 암호 만들기
첫째 줄에 두 정수 L, C가 주어진다. (3 ≤ L ≤ C ≤ 15) 다음 줄에는 C개의 문자들이 공백으로 구분되어 주어진다. 주어지는 문자들은 알파벳 소문자이며, 중복되는 것은 없다.
www.acmicpc.net
딱 봐도 브루트포스이다.
들어가고 안 들어가고, 총 15^2 의 시간복잡도가 소요된다. 따라서 잘 전처리하고, 들어갈때 안 들어갈 때를 구하면 된다.
전처리라고 함은 사전식 배열로 바꾸어 줘야 한다.
그냥 sort로 정렬을 하면 된다.
그러고 나서 재귀로 돌리는데 조건을 잘 짜주자.
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int L, C, mo, ja;
vector<char> v;
vector<char> ans;
void solve(int idx, int num) {
if (num == L) {
if (ja >= 2 && mo >= 1) {
for (int i = 0; i < L; i++)cout << ans[i];
cout << '\n';
}
return;
}
if (idx == C) {
return;
}
bool moem = false;
if (v[idx] == 'a' || v[idx] == 'e' || v[idx] == 'i' || v[idx] == 'o' || v[idx] == 'u') {
moem = true;
}
if (moem)mo++;
else ja++;
ans.push_back(v[idx]);
solve(idx + 1, num + 1);
ans.pop_back();
if (moem)mo--;
else ja--;
solve(idx + 1, num);
}
int main() {
cin >> L >> C;
for (int i = 0; i < C; i++) {
char a;
cin >> a;
v.push_back(a);
}
sort(v.begin(), v.end());
solve(0, 0);
}