혜랑's STORY

[BOJ_C++] 1759번 : 암호만들기 본문

무지성 공부방/알고리즘 해결

[BOJ_C++] 1759번 : 암호만들기

hyerang0125 2021. 7. 21. 14:21

# 문제

# 풀이

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <algorithm>
#include <cstring>
#include <stack>
#include <vector>
#include <cmath>

using namespace std;

int l, c;

void dfs(string s, int now, int depth, char* list) {
    if (depth == l) {
        int za, mo; za = mo = 0;
        for (int i = 0; i < s.length(); i++) {
            if (s[i] == 'a' || s[i] == 'e' || s[i] == 'i' || s[i] == 'o' || s[i] == 'u')
                ++mo;
            else ++za;
        }
        if (za >= 2 && mo >= 1) cout << s << "\n";
        return;
    }
    for (int i = now + 1; i <= c - l + depth; i++)
        dfs(s + list[i], i, depth + 1, list);
}

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

    cin >> l >> c;
    char* list = new char[c];

    for (int i = 0; i < c; i++) cin >> list[i];
    sort(list, list + c);

    string s = "";
    for (int i = 0; i <= c - l; i++)
        dfs(s + list[i], i, 1, list);

    return 0;
}
  • c개의 문자를 모두 입력받아 정렬을 한다.
  • string s를 빈 문자열로 초기화 한 뒤, 정렬된 list의 i번째 원소를 더해가며 dfs를 호출한다.
  • s의 길이가 l과 같아진다면 s가 적어도 1개의 모음과 2개의 자음으로 구성되어 있는지 확인하고 맞다면 s를 출력한다.
  • 아닌 경우 다음 문자 원소들을 더해가며 dfs를 호출한다.
  • 모든 경우의 수를 계산하고 출력한 뒤 프로그램을 종료한다.

# 결과