Be a developer

백준 1759 암호 만들기 본문

알고리즘

백준 1759 암호 만들기

중국고대사 2019. 4. 2. 16:05

일단 암호가 오름차순이 되어야 하므로 입력받은 문자들을 sorting한다.

sort는 algorithm 헤더에 있는 함수이다.

 

문자열을 만들고 문자를 더하여 문장을 만들어 출력해야 하므로, string을 쓴다.

c++은 string 자료형이고, java는 String 자료형이다. 헷갈리지 말자.

 

자세한 설명은 아래 코드의 주석으로..

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
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
 
int l, c;//l은 만들어야 할 암호의 길이, c는 주어지는 알파벳의 수
 
bool check(string str) {
    int mo = 0, ja = 0;
 
    for (int i = 0; i < str.size(); i++) {
        switch (str[i]) {
        case 'a'case 'e'case 'i'case 'o'case'u':
            mo++;
            break;
        default:
            ja++;
        }
        if (mo >= 1 && ja >= 2)return true;
    }
    return false;
}
 
void solve(int idx, string str, vector<char> alpha) {
    //일단 암호의 길이가 len을 넘어가면 절대 답이 될 수 없으므로 먼저 거른다.
    if (str.size() > l) return;
    //암호의 길이가 정해진 길이와 같으면 한 개의 모음과 2개의 자음을 만족하는지 check한다. 모든 조건 만족시 출력한다.
    if (str.size() == l) {
        if (check(str)) {
            //string의 끝에 \0이 없으니까 한 글자씩 출력한다.
            for (int i = 0; i < str.size(); i++) {
                cout << str[i];
            }
            printf("\n");
            return;
        }
    }
    //총 문자의 개수를 넘어서 넣을 수도 있으니까 입력받은 문자의 개수를 초과하면 return 시킨다.
    if (idx + 1 >= c)return;
    //아직 len에 도달하지 못했을 경우 알파벳을 추가하는 경우와 추가하지 않는 경우로 나눈다.
    //추가하는 경우. 다음 알파벳으로 idx를 늘리고, str에 알파벳을 추가한다.
    solve(idx + 1, str + alpha[idx + 1], alpha);
    //추가하지 않는 경우. 추가하지 않으므로 다음 추가할 알파벳으로 idx는 늘리고, str에는 아무것도 추가하지 않는다.
    solve(idx + 1, str, alpha);
}
 
int main(int argc, char** argv) {
    cin >> l >> c;
    vector<char> alpha(c);
 
    for (int i = 0; i < c; i++cin >> alpha[i];
 
    sort(alpha.begin(), alpha.end());
    
    //solve에 들어가서 첫 문자를 넣기 위해서 -1을 인자로 넣어준다.
    solve(-1"", alpha);
    
 
    return 0;
}
cs

'알고리즘' 카테고리의 다른 글

백준 1182 부분수열의 합  (0) 2019.04.03
백준 6603 로또 (재귀)  (0) 2019.04.03
백준 9095 1,2,3 더하기 (재귀)  (0) 2019.04.01
백준 14888 연산자 끼워넣기  (0) 2019.04.01
백준 6603 로또  (0) 2019.04.01
Comments