import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.StringTokenizer;
public class Main {
static int len;
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
len = Integer.parseInt(st.nextToken());
int len_total = Integer.parseInt(st.nextToken());
char[] ans = new char[len];
char[] alph = new char[len_total];
st = new StringTokenizer(br.readLine());
for(int i=0; i<len_total; i++){
alph[i] = st.nextToken().charAt(0);
}
Arrays.sort(alph);
func(alph, ans, 0, 0);
System.out.print(sb);
br.close();
}
private static void func(char[] alph, char[] ans, int alph_index, int ans_index){ //조합
if(ans_index==len){
if(checkalph(ans)){
for(int i=0; i<len; i++){
sb.append(ans[i]);
}
sb.append('\n');
}
return;
}
if(alph_index>=alph.length)
return;
ans[ans_index] = alph[alph_index];
func(alph, ans, alph_index+1, ans_index+1);
func(alph, ans, alph_index+1, ans_index);
}
private static boolean checkalph(char[] ans){ //모음,자음 최소 조건 체크
int mo_cnt = 0;
int ja_cnt = 0;
for(int i=0; i<ans.length; i++){
if(ans[i]=='a' || ans[i]=='e' || ans[i]=='i'
|| ans[i]=='o' || ans[i]=='u')
mo_cnt++;
else
ja_cnt++;
}
if(mo_cnt>=1 && ja_cnt>=2)
return true;
return false;
}
}
입력받은 가능성있는 알파벳 중 len개를 뽑고,
그 문자가 모음/자음 최소 개수 조건을 만족하는 지 확인하여 출력하는 방식으로 풀었다.
좀더 자세히 이야기해보면,
1. len_total개 문자 중 len개 문자를 뽑는다.
중복이 안되고 순서가 없는(ab!=ba) '조합'이다. -> func 함수
2. 뽑은 문자가 모음/자음 최소 개수 조건 (모음1개이상, 자음2개이상)을 만족하는지 체크한다. -> check함수
'1d-1c > BOJ' 카테고리의 다른 글
1652_누울 자리를 찾아라 (JAVA) (0) | 2020.11.19 |
---|---|
1764_듣보잡 (JAVA) (0) | 2020.11.19 |
2309_일곱 난쟁이 (JAVA) (0) | 2020.11.18 |
7562_나이트의 이동 (JAVA) (0) | 2020.11.18 |
2529_부등호 (JAVA) (0) | 2020.11.17 |