코딩 테스트 준비! (백준)/DFS

[DFS] 백준 1759번 암호 만들기 (C++)

lee-soo 2025. 4. 10. 13:46

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

 

아마 이 문제를 보면 다들 머슬메모리처럼 뇌의 기록이 새록새록 피어날 것이다

 

"순열문제자놔?"

 

문제 예시를 보아도 생각할 것이다

 

"순열문제잖아"

 

그냥 char arr형태로 바꿔주면 될거같은데?

https://lee-soo.tistory.com/22

 

[DFS] 백준 6603번 로또 (C++)

https://www.acmicpc.net/problem/6603 자~ 독일 로또를 가져왔다이제 순열을 주구장창 풀어봤다면딱봐도 아하 순열문제구나?그럼 이제 아하? 우리가 풀던데로 풀면 되겠구나?  그럼 너무쉽구나? #include

lee-soo.tistory.com

대충 순열을 사용했던 문제를 한번 보고 와라

 

구조 자체가 비슷하다

 

하지만 한가지 규칙이 존재한다

 

그렇군요

 

그럼, 출력전에 검사하고 보내면 되겄네

 

#include <iostream>
#include <cmath>
#include <algorithm>
#include <vector>
using namespace std;
bool visited[10];
char arr[15];
vector<char> v;
void task(int n, int m, int depth);
int main()
{
    int n, m;

    cin >> n >> m;
    for (int i = 0; i < m; i++)
    {
        cin >> arr[i];
    }
    sort(arr, arr + m);
    task(n, m, 0);
}
void task(int n, int m, int depth)
{

    if (depth == n)
    {
        int count_1 = 0, count_2 = 0;
        for (int i = 0; i < n; i++)
        {
            if (v[i] == 'a' || v[i] == 'e' || v[i] == 'i' || v[i] == 'o' || v[i] == 'u' )
                count_1++;
            else
            {
                count_2++;
            }
        }
        if (count_1 < 1 || count_2 < 2)
        {
            return;
        }
        for (int i = 0; i < n; i++)
            cout << v[i];
        cout << "\n";
        return;
    }
    for (int i = 0; i < m; i++)
    {
        if (!visited[i] && (v.empty() || v.back() < arr[i]))
        {

            visited[i] = true;
            v.push_back(arr[i]);
            task(n, m, depth + 1);
            v.pop_back();
            visited[i] = false;
        }
    }
}

이제 이정도 문제는 머슬메모리 기억으로 손이 가는대로 코딩해도 될거같기도하고