[백트랙킹]백준1759번 암호만들기

업데이트:

백준1759

_2021-02-03__12 58 17

백트랙킹을 연습할 수 있는 문제이다.

알파벳들이 주어졌을 때, 조건에 따라 가능한 모든 조합을 테스트 해보면 된다.

a부터 시작해 백트랙킹을 통해 한자리 한자리 채워가며 가능한 조합을 모두 확인하고 그 다음으로 큰 문자로 넘어가서 다시 가능한 조합을 모두 확인하면 된다.

백트랙킹의 base condition은 depth (백트랙킹 함수로 들어오는 매개변수)가 암호의 길이와 같아졌을 경우이다.

최소 한 개의 모음과 두 개의 자음으로 이루어졌다는 사실을 꼭 조건에 넣어줘야 한다.

모음과 자음을 따로 count 하여 base condition에 도달할 경우 조건을 확인하도록 하였다.

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

using namespace std;

vector<char> alphabet;
char arr[15];
bool isused[15];
int L, C;
int cnt = 0;
int cnt2 = 0;
void btk(int n){
    if(n==L && cnt > 0 && cnt2 >=2){
        for(int i=0;i<L;i++){
            cout << arr[i];
        }
        cout << endl;
        return;
    }
    for(int i=0;i<C;i++){
        if(!isused[i]){
            if(n>0){
                if(arr[n-1] < alphabet[i]){
                    if(alphabet[i]=='a' || alphabet[i]=='e' || alphabet[i]=='i'||alphabet[i]=='o'||alphabet[i]=='u'){
                        cnt++;
                    }
                    else{
                        cnt2++;
                    }
                    arr[n] = alphabet[i];
                    isused[i] = true;
                    btk(n+1);
                    isused[i] = false;
                    if(alphabet[i]=='a' || alphabet[i]=='e' || alphabet[i]=='i'||alphabet[i]=='o'||alphabet[i]=='u'){
                        cnt--;
                    }
                    else{
                        cnt2--;
                    }
                }
            }else{
                if(alphabet[i]=='a' || alphabet[i]=='e' || alphabet[i]=='i'||alphabet[i]=='o'||alphabet[i]=='u'){
                        cnt++;
                    }
                    else{
                        cnt2++;
                    }
                    arr[n] = alphabet[i];
                    isused[i] = true;
                    btk(n+1);
                    isused[i] = false; 
                    if(alphabet[i]=='a' || alphabet[i]=='e' || alphabet[i]=='i'||alphabet[i]=='o'||alphabet[i]=='u'){
                        cnt--;
                    }
                    else{
                        cnt2--;
                    }
            }
        }
    }
}

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    cin >> L >> C;
    for(int i=0;i<C;i++){
        char temp;
        cin >> temp;
        alphabet.push_back(temp);
    }

    sort(alphabet.begin(),alphabet.end());

    btk(0);

}

카테고리:

업데이트:

댓글남기기