백준공부/java

[백준] 1759번 암호 만들기 (gold 5

gomduri43 2024. 3. 5. 23:32

import java.io.*;
import java.util.*;

public class Main{
    //모음 단어 조합
    static ArrayList<String>[] ahdma;
    //자음 단어 조합
    static ArrayList<String>[] wkdma;
    public static void main(String[] args) throws IOException{
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));

        StringTokenizer st=new StringTokenizer(br.readLine());
        //모음 리스트 생성
        ArrayList<String> aei=new ArrayList<>();
        aei.add("");
        //자음 리스트 생성
        ArrayList<String> bcd=new ArrayList<>();
        bcd.add("");
        int l=Integer.valueOf(st.nextToken());
        int c=Integer.valueOf(st.nextToken());

        HashMap<Character,Integer> dict=new HashMap<>();

        st=new StringTokenizer(br.readLine());
        for(int i=0; i<c; i++){
            char a=st.nextToken().charAt(0);
            if(dict.get(a)!=null){
                continue;
            }
            if(a=='a' || a=='e' || a=='i' || a=='o' || a=='u'){
                aei.add(String.valueOf(a));
            }
            else{
                bcd.add(String.valueOf(a));
            }
            dict.put(a,1);
        }

        //모음
        ahdma=new ArrayList[aei.size()];
        //자음
        wkdma=new ArrayList[bcd.size()];

        for(int i=0; i<ahdma.length; i++){
            ahdma[i]=new ArrayList<>();
        }
        for(int i=0; i<wkdma.length; i++){
            wkdma[i]=new ArrayList<>();
        }

        ArrayList<String> answer=new ArrayList<>();
        for(int i=1; i<aei.size(); i++){
            if(bcd.size()-1 < l-i || l-i<2){
                continue;
            }
            dfs(aei, i, 1,true, "");
            dfs(bcd, l-i, 1,false, "");
            for(int j=0; j<ahdma[i].size(); j++){
                for(int k=0; k<wkdma[l-i].size(); k++){
                    answer.add(make(ahdma[i].get(j),wkdma[l-i].get(k),l));
                }
            }
        }

        Collections.sort(answer);
        for(int i=0; i<answer.size(); i++){
            bw.write(answer.get(i)+"\n");
        }
        bw.flush();
    }


    //단어 조합 / 모음이면 true, 자음이면 false로 구분
    public static void dfs(ArrayList<String> temp, int l,int s, boolean is, String w){
        if(w.length()==l){
            if(is){
                ahdma[l].add(w);
            }
            else{
                wkdma[l].add(w);
            }
            return;
        }
        for(int i=s; i<temp.size(); i++){
            dfs(temp, l,i+1, is, w.concat(temp.get(i)));
        }
    }



    //단어만들기
    public static String make(String a, String b, int l){
        char[] temp=new char[l];
        String w=a.concat(b);
        for(int i=0; i<l; i++){
            temp[i]=w.charAt(i);
        }
        Arrays.sort(temp);
        w="";
        for(int i=0; i<temp.length; i++){
            w=w.concat(String.valueOf(temp[i]));
        }
        return w;
    }
}



//미완성코드..