공부 자료/알고리즘
(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