[백준/BOJ] 백준 1759번 : 암호 만들기

2021. 2. 28. 19:34알고리즘 문제풀이

www.acmicpc.net/problem/1759

 

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;
}