조건
- L : 암호 문자 수, 3~15 이하 자연수
- C : 암호로 사용할 수 있는 문자 수, 3~15 이하 자연수
- 완성된 암호는 최소 1개의 모음, 2개의 자음으로 구성되어 있다.
접근 방법
- 조합
- 글자 수가 15 이하 => 조합 dfs를 돌려도 시간초과 나지 X
- 조합 dfs로 문자 완성되면, 암호 조건(모음 1개, 자음 2개 이상) 체크 후 출력
솔루션
public class Main {
static char[] alpha;
static boolean[] check;//모음 체크를 위한 배열
static int L, C;//암호 길이, 문자 개수
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine().trim());
L = Integer.parseInt(st.nextToken());
C = Integer.parseInt(st.nextToken());
alpha = new char[C];
check = new boolean[26];
check['a'- 'a'] = check['e'- 'a'] = check['i'- 'a'] = check['o'- 'a'] = check['u'- 'a'] = true;
st = new StringTokenizer(br.readLine().trim(), " ");
for(int i = 0; i < C; i++) {
alpha[i] = st.nextToken().charAt(0);
}
Arrays.sort(alpha);
combi(0,0,new StringBuilder());
}
private static void combi(int idx, int cnt, StringBuilder pw) {
if(cnt == L) {//암호 완성
int tmp = 0;//모음 개수
for(int i = 0; i < L; i++) {
if(check[pw.charAt(i) - 'a']) tmp++;
}
if(tmp > 0 && L-tmp > 1) {//모음 1개 이상, 자음 2개 이상 확인
System.out.println(pw.toString());
}
return;
}
for(int i = idx; i < C; i++) {
combi(i+1, cnt+1, pw.append(alpha[i]));
pw.deleteCharAt(cnt);
}
}
}
리뷰
- 평범함 조합 문제
'알고리즘 > DFS&BFS(깊이&너비 우선 탐색)' 카테고리의 다른 글
백준_진우의민트초코우유_20208 (0) | 2021.01.29 |
---|---|
백준_가르침_1062 (1) | 2021.01.27 |
백준_욕심쟁이판다_1937 (0) | 2021.01.20 |
백준_비숍_1799 (0) | 2021.01.18 |
백준_미로만들기_2665 (0) | 2021.01.13 |