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

2023. 1. 21. 03:29알고리즘/조합

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

 

1759번: 암호 만들기

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

www.acmicpc.net

 

풀이

순열을 이용한 조합 방법이 있어서 적용시켜봤다.

 

vector<bool> n을 사용했는데 { 1, 1, 1, 0, 0, 0, 0 } 의 꼴로 저장한 다음 이전 순열로 돌려주면 마지막엔 { 0, 0, 0, 0, 1, 1, 1 } 이 된다.

여기서 1 에 해당하는 배열 위치의 값을 추출하면 조합이 된다.

 

{ 1, 1, 1, 0, 0, 0, 0 }

{ a, b, c, d, e, f, g }

 

여기서 부터 시작해서 

 

 

{ 0, 0, 0, 0, 1, 1, 1 }

{ a, b, c, d, e, f, g

 

까지 진행된다.

 

이전 순열로 돌려주는 이유는 출력을 사전 순으로 하기 위함이다.

 

 

그리고 출력은 최소 한 개의 모음(a, e, i, o, u)과 최소 두 개의 자음으로 구성되어 있는 조건을 달아주면 된다.

 

전체 코드

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

using namespace std;

int L, C;
vector<char> v;
vector<bool> n;

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

    cin >> L >> C;

    for (int i = 0; i < C; i++) {
        char c;
        cin >> c;
        v.push_back(c);
    }
    sort(v.begin(), v.end());

    for (int i = 0; i < L; i++) n.push_back(true);
    for (int i = L; i < C; i++) n.push_back(false);

    do {
        vector<char> s;
        int aeiou = 0;

        for (int i = 0; i < C; i++) {
            if (n[i] == 1) {
                if(v[i] == 'a' || v[i] == 'e' || v[i] == 'i' || v[i] == 'o' || v[i] == 'u') aeiou++;
                s.push_back(v[i]);
            }
        }
        if (aeiou == 0 || L - aeiou < 2) continue;
        for (auto i : s) cout << i;
        cout << '\n';

    } while (prev_permutation(n.begin(), n.end()));
}

 

'알고리즘 > 조합' 카테고리의 다른 글

백준 5874번: 소를 찾아라 (C++)  (0) 2023.01.26