본문 바로가기

짜잘한 기록

백준 1759 암호 만들기

브루트포스 알고리즘을 사용하는 문제를 찾아서 풀어보았다.

순서대로 조건에 맞는 문자열의 모든 경우의 수를 출력하면 된다.

다른 코테에서 풀어본 적 있는 문제라 유사하게 풀어봤다.

 

사용 가능한 문자들을 입력받은 뒤, 알파벳 순으로 정렬한다.

그 배열을 사용해 DFS로 한 글자씩 붙여가며 탐색을 한다.

길이를 확인해 우리가 원하는 길이가 되면, 조건을 확인한다. 여기서 조건은 모음과 자음의 개수이다.

조건이 맞으면 출력한다. 알파벳순으로 문자들을 정렬했기에 조건에 맞을때마다 출력하면 된다.


#include <iostream>
#include <vector>
#include <algorithm>
#include <string>

int l, c;
std::vector<char> alpha;

bool checkVowel(std::string cur)
{
    int Vowel = 0;
    int Conson = 0;
    for (char c : cur)
    {
        if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u')
            Vowel++;
        else
            Conson++;
    }
    if (Vowel >= 1 && Conson >= 2)
        return true;
    else
        return false;
}

void dfs(int len, std::string cur)
{
    if (len == l)
    {
        if (len > 2 && checkVowel(cur))
            std::cout << cur << '\n';
        return;
    }
    else
    {
        for (char c: alpha)
        {
            if (cur[cur.size()-1] < c)
                dfs(len+1, cur+c);
        }
    }
}

int main()
{
    std::cin >> l >> c;
    for (int i = 0; i < c; i++)
    {
        char tmp;
        std::cin >> tmp;
        alpha.push_back(tmp);
    }
    std::sort(alpha.begin(), alpha.end());
    dfs(0, "");
}

 

좀 간단하다. 다른 문제들도 풀어봐야겠다. 한번에 풀고 거의 바로 솔루션 되어서 좋았다 후후후후

오늘도 평온한 하루가 되길. 슨민.

'짜잘한 기록' 카테고리의 다른 글

백준 1747 소수&팰린드롬  (0) 2021.11.26
백준 1107 리모컨  (0) 2021.11.25
백준 1300 K번째 수  (0) 2021.11.19
백준 1981 배열에서 이동  (0) 2021.11.18
백준 2470 두 용액  (0) 2021.11.17