백준공부/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;
}
}
//미완성코드..