ALGORITHM

[JAVA] 백준 1759번- 암호 만들기

연듀 2022. 12. 14. 10:25

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

 

1759번: 암호 만들기

첫째 줄에 두 정수 L, C가 주어진다. (3 ≤ L ≤ C ≤ 15) 다음 줄에는 C개의 문자들이 공백으로 구분되어 주어진다. 주어지는 문자들은 알파벳 소문자이며, 중복되는 것은 없다.

www.acmicpc.net

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main{
    static char[] arr, password;
    static int L, C;

    public static void dfs(int cnt, int start){
        if(cnt==L){ // 암호의 길이가 L이면
            int c=0, v=0;
            for(char x : password){
                if(x=='a' || x=='e' || x=='i' || x=='o' || x=='u') v++; // 모음이면
                else c++;
            }

            if (v >= 1 && c >= 2) {
                for(char x :password){
                    System.out.print(x);
                }
                System.out.println();
            }

            return;
        }

        for(int i=start; i<C; i++){
            password[cnt] = arr[i];
            dfs(cnt+1, i+1); // 암호를 이루는 알파벳이 증가하는 순서로 배열되야 하므로 -> 방문처리도 안해줘도 된다.
        }
    }
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        st = new StringTokenizer(br.readLine());

        L = Integer.parseInt(st.nextToken()); // 암호는 L개의 알파벳 소문자들로 구성
        C = Integer.parseInt(st.nextToken()); // C개의 문자들

        arr = new char[C];
        password = new char[L];

        st = new StringTokenizer(br.readLine());
        for(int i=0; i<C; i++){
            arr[i] = st.nextToken().charAt(0);
        }

        Arrays.sort(arr); // 알파벳이 증가하는 순서대로 정렬
        dfs(0, 0);

    }
}