알고리즘 모음(C++)

백준 1759 - 암호 만들기(C++) 본문

백준

백준 1759 - 암호 만들기(C++)

공대생의 잡다한 사전 2023. 1. 28. 16:11

문제 링크입니다. https://www.acmicpc.net/problem/1759

 

1759번: 암호 만들기

첫째 줄에 두 정수 L, C가 주어진다. (3 ≤ L ≤ C ≤ 15) 다음 줄에는 C개의 문자들이 공백으로 구분되어 주어진다. 주어지는 문자들은 알파벳 소문자이며, 중복되는 것은 없다.

www.acmicpc.net

백트래킹을 이용한 문제였습니다.

주어진 알파벳을 통해 암호를 만드는 문제입니다.

암호가 되는 조건은 모음이 1개 이상, 자음이 2개 이상입니다.

나올 수 있는 모든 경우를 출력하는 것이기에 백트래킹을 사용하면 됩니다.

 

또한, 출력은 사전 순이기에 백트래킹을 시작하기 전에, 오름차순 정렬을 해주고 시작하면 편하게 코드를 짤 수 있습니다.

 

 

 

자세한 것은 코드를 참고해주세요

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstring>
#include <vector>
#include <algorithm>
#include <queue>
#include <cmath>
#include <cstdio>
#include <string>
#include <deque>
#include <stack>
#include <map>

using namespace std;

int N, M;
char Alpabet[16];
int check[16];
vector<char> Select;

void select_alpha(int start, int now, int cnt){
    if(now == cnt){
        int C = 0, V = 0;
        for(int i = 0; i < Select.size(); i++){
            if(Select[i] == 'a' || Select[i] == 'e' || Select[i] == 'i' || Select[i] == 'o' || Select[i] == 'u'){
                V++;
            }
            else C++;
        }
        if(V >= 1 && C >= 2){
            for(int i = 0; i < Select.size(); i++) cout << Select[i];
            cout << "\n";
        }
    }
    else{
        for(int i = start; i <= M; i++){
            if(check[i] != 0) continue;
            Select.push_back(Alpabet[i]);
            check[i] = 1;
            select_alpha(i, now+1, cnt);
            check[i] = 0;
            Select.pop_back();
        }
    }
}

void solve() {
    sort(Alpabet+1, Alpabet+M+1);
    for(int i = 1; i <= M; i++){
        Select.push_back(Alpabet[i]);
        check[i] = 1;
        select_alpha(i, 1, N);
        check[i] = 0;
        Select.pop_back();
    }
}

int main() {
	cin.tie(0);
	cout.tie(0);
	cin >> N >> M;
	for(int i = 1; i <= M; i++){
	    cin >> Alpabet[i];
	}
	solve();
	return 0;
}

 

 

질문 및 조언은 댓글을 남겨주세요

'백준' 카테고리의 다른 글

백준 11652- 카드(C++)  (0) 2023.01.28
백준 10757 - 큰 수 A+B(C++)  (0) 2023.01.28
백준 1450 - 냅색 문제(C++)  (0) 2023.01.24
백준 1208 - 부분수열의 합 2(C++, 복습)  (0) 2023.01.23
백준 9252 - LCS 2(C++, 복습)  (0) 2023.01.23