백준 #1759 암호 만들기

1 minute read

백준 #1759 암호 만들기

알파벳 C 개 중 L 개를 고르는 조합을 모두 출력하는 문제. 단, 적어도 모음 한 개와 자음 두 개가 있어야 한다.
재귀적으로 조합을 구하는 알고리즘을 사용하면 구할 수 있다.

c0
c0
c1
c1
c2
c2
c3
c3
cC
cC
C개
C개
c0
c0
c0
c0
c1
c1
c0
c0
c1
c1
select c0
select c0
don't select c0
don't select c0
select c1
select c1
select c1
select c1
don't select c1
don't select c1
don't select c1
don't select c1
L개
L개
Viewer does not support full SVG 1.1

알파벳 C개를 모두 정렬 후, 첫 알파벳부터 고르거나 고르지 않거나를 selected라는 string에 저장하여 인자로써 재귀적으로 넘겨준다. 이 때 모음과 자음의 개수 또한 계산해 인자로 넘겨준다. 총 L개를 골랐을 때, 모음이 적어도 한 개, 자음이 적어도 두 개일 경우 selected를 출력한다.

#include <iostream>
#include <bits/stdc++.h>
#include <string>
#include <algorithm>

using namespace std;

int L, C;



void comb(string& alphList, string selected, int idx, int vCount, int cCount) {
    if(selected.size() == L && vCount >= 1 && cCount >= 2) {  // selected의 size가 L인 경우(다 고름)
        cout << selected << "\n";
        return;
    }
    if(idx >= C) {   //index가 전체 알파벳 개수를 넘길 때(다 못 고르는 경우)
        return;
    }
    selected.push_back(alphList[idx]); //고르는 경우
    if(alphList[idx] == 'a' || alphList[idx] == 'e' || alphList[idx] == 'i' || alphList[idx] == 'o' || alphList[idx] == 'u') { //모음일 경우 vCount + 1
        comb(alphList, selected, idx + 1, vCount + 1, cCount);
    }
    else {
        comb(alphList, selected, idx + 1, vCount, cCount + 1); //자음일 경우 cCount + 1
    }
    selected.pop_back();
    comb(alphList, selected, idx + 1, vCount, cCount); //고르지 않는 경우
}


int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> L >> C;
    string alphList = "";
    string selected = "";
    for(int i = 0; i < C; i++) {
        char c;
        cin >> c;
        alphList.push_back(c);
    }
    sort(alphList.begin(), alphList.end());
    comb(alphList, selected, 0, 0, 0);
    return 0;
}

Comments