알고리즘/분할정복 & 재귀 & 백트래킹

[백준] 1759 암호만들기

HJ39 2023. 5. 15. 01:47

약간의 백트래킹 방법에서 살짝만 바뀐 방법으로 문제를 해결할 수 있다.

 

일반적으로라면 count를 증가시켜 확인 후 return; 하지만

해당 문제는 모음 개수와 자음 개수를 따로 계산하여 가져가야한다.

 

나머지는 백트래킹 하듯이 하면 해결할 수 있다.

 

#include <bits/stdc++.h>

using namespace std;

int L1759, C1759;
vector<char> input1759;
vector<char> result1759;
vector<bool> check1759(16,false);
char vowelList1759[] = {'a','e','i','o','u'};

void backback1759(int pos, int vowelCount, int conCount){
    
    if(vowelCount + conCount == L1759 and vowelCount >= 1 and conCount >= 2){
        for(int i=0;i<L1759;++i)
            cout<<result1759[i];
        cout<<"\n";
        return;
    }
    
    
    for(int i=pos; i<C1759; ++i){
        if(!check1759[i]){
            bool check = true;
            check1759[i] = true;
            result1759.push_back(input1759[i]);
            
            for(int j=0;j<5;++j)
                if(input1759[i] == vowelList1759[j])
                    check = false;
            
            if(check)
                backback1759(i+1, vowelCount, conCount+1);
            else
                backback1759(i+1, vowelCount+1, conCount);
                
            result1759.pop_back();
            check1759[i] = false;
        }
    }
    
}

void password1759(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    
    cin>>L1759>>C1759;
    
    
    for(int i=0; i<C1759; ++i){
        char a; cin >> a;
        input1759.push_back(a);
    }
    
    sort(input1759.begin(), input1759.end());
    
    backback1759(0, 0, 0);
}

'알고리즘 > 분할정복 & 재귀 & 백트래킹' 카테고리의 다른 글

[백준] 1987 알파벳  (0) 2023.05.15
[백준] 1182 부분 수열의 합  (0) 2023.05.15
[백준] 6603 로또  (0) 2023.05.15
[백준] 1780 종이의 개수  (0) 2023.05.04
[백준] 1992 쿼드 트리  (0) 2023.05.04