공부 자료/알고리즘

(C/C++) 백준 1759번 - 암호 만들기

뚜루뚜루세니 2021. 7. 19. 16:43
728x90

문제출처: https://www.acmicpc.net/problem/1759

 

1759번: 암호 만들기

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

www.acmicpc.net

 

1. 코드

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>

using namespace std;
int L, C;
char alpa[16];

void makepassword(int pos, string password, int vow, int con) { //vow 모음, con 자음
	int length = password.size();
	if (length == L) {
		if (vow >= 1 && con >= 2) { //자음, 모음 갯수 조건 만족
			printf("%s\n", password.c_str()); //출력
			return;
		}
	}
	else {
		for (int i = pos; i < C; i++) {
			if (alpa[i] == 'a' || alpa[i] == 'e' || alpa[i] == 'i' || alpa[i] == 'o' || alpa[i] == 'u') {
				makepassword(i + 1, password + alpa[i], vow + 1, con);
			}
			else {
				makepassword(i + 1, password + alpa[i], vow, con + 1);
			}
		}
		return;
	}

}

int main(void) {
	scanf("%d %d", &L, &C);
	for (int i = 0; i < C; i++) {
		cin >> alpa[i];
	}
	sort(alpa, alpa+C);
	makepassword(0, "", 0, 0);
}

2. 해결과정

알파벳이 증가하는 순서대로 배열 -> 오름차순 정렬 필요

L : 정답 암호의 길이

alpa : 사용할 수 있는 C개의 알파벳

password : 현재 만들고 있는 암호

 

길이와 자음 모음 갯수의 조건이 있기 때문에 출력하는 부분에서 확인이 필요하다.

length = password.size()로 구함

고른 알파벳이 자음인지 모음인지에 따라 나누고, 알파벳 보다 큰 인덱스의 알파벳만 탐색하게 진행하면 된다.

 

3. 느낀점

너무 까다로웠던 문제. 

728x90