펭로그

[C++] 백준 BOJ 1759 암호 만들기 본문

Study/PS(Algorithm)

[C++] 백준 BOJ 1759 암호 만들기

노랑펭귄 2018. 10. 1. 16:00

문제링크 : https://noj.am/1759



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
// BOJ 1759 암호 만들기
#include <iostream>
#include <vector>
#include <algorithm>
 
using namespace std;
 
vector<char> arr; // 전체 문자
vector<char> mo;  // 모음
vector<char> answer; // 정답 문자
vector<char> expt;  // 검색 제외
vector<vector<char> > result; // 출력
int size, inp; // 문자열 길이, 입력 크기
 
// 모음인지?
bool isMo(char input){
    return (input == 'a' || input == 'e' || input == 'i'
            || input == 'o' || input == 'u');
}
// 검색할 문자가 제외 문자인지?
bool except(char input){
    for(char e : expt)
        if(input == e)
            return true;
    return false;
}
 
// 문자열 선택
void pick(){
    // 정답 출력
    if(answer.size() >= size){
        vector<char> output = answer;
        sort(output.begin(), output.end());
        int numOfJa = 0// 자음 갯수
        for(char c : output){
            if(!isMo(c))
                numOfJa++;
        }
        // 자음 2개 이상
        if(numOfJa >= 2)
            result.push_back(output);
        answer.pop_back();
        return;
    }
    char s = answer.back();
    for(char i : arr){
        if((answer.size() == 1 || i > s) && !except(i)){
            answer.push_back(i);
            pick();
        }
    }
    answer.pop_back();
    return;
}
 
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    // freopen("../input.txt", "r", stdin);
 
    cin >> size >> inp;
 
    char tmp;
    for (int i = 0; i < inp; i++) {
        cin >> tmp;
        if (isMo(tmp))
            mo.push_back(tmp);
        arr.push_back(tmp);
    }
 
    sort(arr.begin(), arr.end());
    sort(mo.begin(), mo.end());
 
    for(char m : mo){
        // 모음을 벡터에 push
        answer.push_back(m);
        // 검색시 스킵을 위해
        expt.push_back(m);
        pick();
    }
 
    sort(result.begin(), result.end());
 
    for(auto r : result){
        for(char o : r)
            cout << o;
        cout << '\n';
    }
 
    return 0;
}
cs


Comments