Game Develop

[Algorithm]Baekjoon 1759번 : 암호 만들기 본문

Algorithm/Baekjoon

[Algorithm]Baekjoon 1759번 : 암호 만들기

MaxLevel 2022. 7. 18. 01:01

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

 

1759번: 암호 만들기

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

www.acmicpc.net

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
#include <iostream>
#include <string>
#include <map>
#include <vector>
#include <algorithm>
#include <math.h>
#include <queue>
#include <functional>
#include <sstream>
 
using namespace std;
 
int targetCount = 0;
vector<string> answer;
map<stringbool> isVowel;
 
void solution(int index, string sum,int conCount, int vowelCount, vector<string>& input)
{
    string before = sum;
    sum += input[index];
    
    int prevVowelCount = vowelCount;
    int prevConCount = conCount;
 
    if (isVowel[input[index]]) vowelCount += 1;
    else conCount += 1;
    
    if (sum.size() == targetCount)
    {
        if (vowelCount >= 1 && conCount >= 2)
        {
            answer.push_back(sum);
        }
    }
 
    if (index + 1 <= input.size() - 1)
    {
        solution(index + 1, sum, conCount,vowelCount,input); // 자기자신 포함값
        solution(index + 1, before, prevConCount,prevVowelCount,input); // 비포함값
    }
    else return;
}
 
 
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
 
    int l = 0;
    int c = 0;
    string input = "";
    vector<string> strings;
 
    isVowel["a"= true;
    isVowel["e"= true;
    isVowel["i"= true;
    isVowel["o"= true;
    isVowel["u"= true;
 
    cin >> l >> c;
 
    targetCount = l;
 
    for (int i = 0; i < c; i++)
    {
        cin >> input;
        strings.push_back(input);
    }
 
    sort(strings.begin(), strings.end());
    
    solution(0""0,0,strings);
    
    for (auto temp : answer)
    {
        cout << temp << endl;
    }
 
}
 
cs

 

이전에 풀었던 백트래킹 기본예제에서 좀 더 응용한 문제다.

추가된 조건은 

 

1. 암호는 알파벳순이여야 한다.

2. 모음은 최소 1개이상, 자음은 최소 2개이상이여야 한다.

 

알파벳순이여야하기 때문에 일단 input값들에 대해 정렬을 한번 해줬고, 재귀를 돌릴 때 '자기자신을 포함한 값'을 먼저 실행하게 했다. 비포함을 먼저하면 알파벳역순으로 실행되니 주의하자.

 

모음 자음검사는 모음에대한 룩업테이블을 만들어서 해결했다. 타겟크기의 사이즈가 될 때, 모음 자음개수가 조건에 맞아야 결과벡터에 넣을수 있게 코드를 작성했다.

map의 value에 bool자료형을 선언할 경우 디폴트로 false가 셋팅되기 때문에 개수가 적은 모음에 대해서만 true를 미리 넣어놓고 검사하는 식으로 작성했다.

물론 자기자신 비포함에 대해 재귀를 돌릴때는 모음,자음 카운트도 카운팅하기전 값으로 넣어줘야한다.