Baekjoon Review

[Gold 5] 1759 암호 만들기

hanseongbugi 2024. 9. 5. 18:45

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

 

백트레킹을 사용해서 해결할 수 있는 문제이다.

암호에 사용되는 알파뱃은 반드시 모음 1개 이상과 자음 2개 이상이 필요하다.

따라서 depth가 L일 때 모음과 자음 수를 비교한 후 answer를 출력할 수 있도록 한다.

 

#include <iostream>
#include <algorithm>
using namespace std;

int L, C;
char alpha[16];
char answer[16];
int visited[16];

void dfs(int idx, int moCnt, int jaCnt, int depth){
    if(depth == L && moCnt >= 1 && jaCnt >= 2){
        for(int i = 0;i<L;i++){
            cout<<answer[i];
        }
        cout<<'\n';
        return;
    }
    for(int i = idx;i<C;i++){
        if(!visited[i]){
            visited[i] = true;
            answer[depth] = alpha[i];
            if(alpha[i] == 'a' ||alpha[i] == 'e'||alpha[i] == 'i'||alpha[i] == 'o'||alpha[i] == 'u'){
                dfs(i + 1, moCnt + 1, jaCnt, depth + 1);
            }
            else{
                dfs(i + 1,moCnt, jaCnt + 1, depth + 1);
            }
           
            visited[i] = false;
        }
    }
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    
    cin>>L>>C;

    for(int i = 0;i<C;i++)
        cin>>alpha[i];
    sort(alpha, alpha + C);
    dfs(0, 0, 0, 0);
}