카테고리 없음

백준 Java | BOJ #1759 암호 만들기

토마토. 2023. 1. 30. 16:33
package P1759;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Arrays;
import java.util.Scanner;

public class Main {
    static int L;
    static int C;
    static char[] candidate;
    static boolean[] visited;
    static int depth;
    public static void main(String[] args) throws FileNotFoundException {
        System.setIn(new FileInputStream("src/P1759/input.txt"));
        Scanner scanner = new Scanner(System.in);
        L = scanner.nextInt();
        C = scanner.nextInt();
        candidate = new char[C];
        for (int i=0;i<C;i++){
            candidate[i] = scanner.next().charAt(0);
        }
        Arrays.sort(candidate);

        visited = new boolean[C];
        depth = 0;
        for (int i=0;i<C;i++){
            if (candidate[i]=='a'||candidate[i]=='e'||candidate[i]=='i'||candidate[i]=='o'||candidate[i]=='u'){
                // -> 모음인 경우
                dfs(i, 1, 0);
            } else {
                // 5. 간다 -> 자음인 경우 : parameter or static var
                dfs(i, 0, 1);
            }
        }
    }
    public static void dfs(int index, int mo, int za){
        // 1. 체크인
        visited[index] = true;
        depth++;

        // 2. 목적지인가 -> L개가 되었는가 -> 자음 2개, 모음 1개 이상
        if (depth == L){
            if (mo >= 1 && za >= 2){
                for (int i=0;i<C;i++){
                    if (visited[i]){
                        System.out.print(candidate[i]);
                    }
                }
                System.out.println();
            }

        } else {
            // 3. 연결된 곳을 순회 -> 내 다음 알파벳
            for (int i=index+1;i<C;i++){
                // 4. 가능한가
                if (candidate[i]=='a'||candidate[i]=='e'||candidate[i]=='i'||candidate[i]=='o'||candidate[i]=='u'){
                    // -> 모음인 경우
                    dfs(i, mo+1, za);
                } else {
                    // 5. 간다 -> 자음인 경우 : parameter or static var
                    dfs(i, mo, za+1);
                }
            }
        }
        // 6. 체크아웃
        visited[index] = false;
        depth--;
    }
}