알고리즘
백준 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 |