코딩성장스토리

백준 1759번: 암호 만들기 본문

백준 코딩

백준 1759번: 암호 만들기

까르르꿍꿍 2022. 1. 28. 18:35

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

 

1759번: 암호 만들기

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

www.acmicpc.net

 

이 문제를 볼때 브루트포스(완전탐색)가 가능한 범위였고 그냥 for문으로 풀까 고민하고 순열로 할까 고민했다. 순열로 

일단 백준강의에서는 재귀로 나왔고 재귀적으로 생각하기에는 아직 벅찼다. 어쨋든 재귀적으로 구현을 완료했으며 코드를 보자

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
bool check(string password){     //자음 최소 2개 이상 모음 최소1개이상 조건 충족하는지
    int ja=0;
    int mo=0;
    for(char c:password){
        if(c=='a'||c=='e'||c=='i'||c=='o'||c=='u'){
            mo++;
        }else{
            ja++;
        }
    }
    return mo>=1&&ja>=2;
}
void go(int n,vector<char> &c,string password,int i){
    if(password.length()==n){                             //패스워드 길이가 주어진 길이랑 같을 떄 출력
        if(check(password)){
            cout<<password<<'\n';
        }
        return;
    }
    if(i>=c.size()){
        return;
    }
    go(n,c,password+c[i],i+1);                      //i번째 패스워드 추가하고 다음
    go(n,c,password,i+1);                            //i번쨰 패스워드 추가 안하고 다음
}
int main(){
    int l,c;
    cin>>l>>c;
    vector<char> carr(c);
    string str="";
    for(int i=0;i<c;i++){
        cin>>carr[i];
        cin.ignore();
    }
    sort(carr.begin(),carr.end());          //정령후 이용
    go(l,carr,str,0);


}

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

백준 2580번:스도쿠  (0) 2022.02.04
백준 9663번:N-Queen  (0) 2022.01.29
백준 1764번:듣보잡  (0) 2022.01.27
백준 7785번 : 회사에 있는 사람(역방향반복자 ,반복자)  (0) 2022.01.26
백준 2022번:사다리  (0) 2022.01.25