알고리즘 관련/BOJ

1759 암호 만들기

Andrew-Yun 2020. 12. 14. 22:34

www.acmicpc.net/problem/1759

 

1759번: 암호 만들기

첫째 줄에 두 정수 L, C가 주어진다. (3 ≤ L ≤ C ≤ 15) 다음 줄에는 C개의 문자들이 공백으로 구분되어 주어진다. 주어지는 문자들은 알파벳 소문자이며, 중복되는 것은 없다.

www.acmicpc.net

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int L, C;
vector<char> charset;
vector<char> vowels = { 'a', 'e', 'i', 'o', 'u' };
bool IsPassword(vector<char>& picked)
{
	/*
	암호를 판단하는 기준
	모음의 개수 >= 1
	조합의 길이 - 모음의 개수 >= 2
	*/
	int cnt = 0;
	for (const auto& ch1 : picked) {
		for (const auto& ch2 : vowels) {
			if (ch1 == ch2) {
				++cnt;
				break;
			}
		}
	}
	if (cnt >= 1) {
		if (picked.size() - cnt >= 2) {
			return true;
		}
		else {
			return false;
		}
	}
	else {
		return false;
	}
}
void printPicked(vector<char>& picked)
{
	for (const auto& item : picked) {
		printf("%c", item);
	}
	printf("\n");
}
void pick(int n, vector<char>& picked, int toPick, int idx)
{
	if (toPick == 0 && IsPassword(picked)){	printPicked(picked); return; }
	int smallest = picked.empty() ? 0 : idx + 1;
	for (int next = smallest; next < n; ++next) {
		picked.push_back(charset[next]);
		pick(n, picked, toPick - 1, next);
		picked.pop_back();
	}
}
int main()
{
	vector<char> picked;
	cin >> L >> C;
	char ch;
	for (int i = 0; i < C; i++) {
		cin >> ch;
		charset.push_back(ch);
	}
	sort(charset.begin(), charset.end());
	pick(C, picked, L, 0);
	return 0;
}