[백준 1759] 암호 만들기

silverCastle·2022년 1월 27일
0

https://www.acmicpc.net/problem/1759

✍️ 첫번째 접근

전형적인 백트래킹문제라고 생각하는데 몇가지 조건을 추가해주면 된다.
첫째, 암호는 최소 한 개의 모음(a, e, i, o, u)과 최소 두 개의 자음으로 구성되어 있다고 하였으니 출력하게 되는 암호에 최소 한 개의 모음이 있어야 하고 최소 두 개의 자음이 있어야 한다.
둘째, 암호를 이루는 알파벳이 암호에서 증가하는 순서로 배열되었을 것이라고 하였으니 입력받은 C개의 문자들을 sort해야 한다.

#include <bits/stdc++.h>
using namespace std;
int l,c;
char alphabet[16];
int arr[16];
bool isused[16];
void func(int k) {
    if(k == l) {
        int vowels = 0, consonants = 0;
        for(int i = 0; i < k; i++) {
            if(alphabet[arr[i]] == 'a' || alphabet[arr[i]] == 'e' || alphabet[arr[i]] == 'i' || alphabet[arr[i]] == 'u' || alphabet[arr[i]] == 'o')
                ++vowels;
            else
                ++consonants;
        }
        if(vowels == 0)
            return;
        if(consonants < 2)
            return;
        for(int i = 0; i < k; i++) {
            cout << alphabet[arr[i]];
        }
        cout << '\n';
        return;
    }
    int st = 0;
    if(k != 0)
        st = arr[k-1];
    for(int i = st; i < c; i++) {
        if(!isused[i]) {
            arr[k] = i;
            isused[i] = 1;
            func(k+1);
            isused[i] = 0;
        }
    }
}
int main(void) {
    ios::sync_with_stdio(0);
    cin.tie(0);

    cin >> l >> c;
    for(int i = 0; i < c; i++)
        cin >> alphabet[i];
    sort(alphabet,alphabet+c);
    func(0);

    return 0;
}

0개의 댓글