백준 [1759] "암호 만들기"

Kimbab1004·2024년 7월 23일
0

Algorithm

목록 보기
54/102

기본적인 백트래킹 문제에서 자음과 모음 최소 개수라는 조건이 걸려있는 문제였다. 오랜만에 백트래킹 문제를 풀어보니 조금 헤맸지만 결국 풀이에 성공하였는데 계속 오답이 나왔다.

이유를 알아보니 조건에 "모음"에 만 신경써 "자음" 개수를 생각하지않아 반례로 모음만이 들어갔을때 모음으로만 조합을 하게 된 것이 문제였다.

모음, 자음 개수를 따로 계산해 문제를 해결하였는데 후에 다시 생각해보니 굳이 개수를 따로 저장하지 않아도 해결 할 수 있을거 같다는 생각이 들었다.

정답

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

using namespace std;
int l,c;
string a;
vector<string> passward;
vector<string> mo_list;
vector<string> ja_list;
bool visit[16] = { false };
//vector<char> mo;
int mo = 0;
void backtracking(int ct, int moum, int start, int jaum) {
    //현재 카운트가 입력받은 l과 같아 졌을때
    if (ct == l && moum < mo_list.size() && jaum>=2) {

        for (int i = 0; i < passward.size(); i++) {
            if (visit[i] == true) {
                cout << passward[i];
            }
        }
        cout << endl;
    }

    else {
        for (int i = start; i < passward.size(); i++) {

            //현재 비밀번호가 모음이고 모음을 
            if ((passward[i] == "a" || passward[i] == "e" || passward[i] == "i" || passward[i] == "o" || passward[i] == "u") && moum > 0) {
                visit[i] = true;
                backtracking(ct + 1, moum - 1, i+1, jaum);
                visit[i] = false;
            }

            else if ((passward[i] == "a" || passward[i] == "e" || passward[i] == "i" || passward[i] == "o" || passward[i] == "u") && moum == 0) {
                continue;
            }

            else {
                visit[i] = true;
                backtracking(ct + 1, moum, i+1, jaum + 1);
                visit[i] = false;
            }
        }
    }
    return;
}

int main() {

    cin >> l >> c;

    for (int i = 0; i < c; i++) {

        cin >> a;

        if (a == "a" || a == "e" || a == "i" || a == "o" || a == "u") {
            mo_list.push_back(a);
        }
        else {
            ja_list.push_back(a);
        }

        passward.push_back(a);

    }

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

    backtracking(0, mo_list.size(), 0, 0);


    return 0;
}

0개의 댓글