본문 바로가기
알고리즘/백준

[백준] 1759 암호만들기 c++

by 오오오니 2022. 7. 8.

주어진 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