https://www.acmicpc.net/problem/1759
1759번: 암호 만들기
첫째 줄에 두 정수 L, C가 주어진다. (3 ≤ L ≤ C ≤ 15) 다음 줄에는 C개의 문자들이 공백으로 구분되어 주어진다. 주어지는 문자들은 알파벳 소문자이며, 중복되는 것은 없다.
www.acmicpc.net
간단한 백트래킹 문제입니다.
출력이 오름차순이므로 입력으로 주어지는 알파벳을 오름차순으로 먼저 정렬해줍니다.
그 다음 재귀를 통해 알파벳을 추가할 때마다 모음인지 자음인지 확인하여 갯수를 갱신시켜주면서 재귀를 돌려줍니다.
가능한 암호조합을 모두 찾아낸 후에 이 조합이 모음 1개, 자음 2개 이상을 포함하고 있는 경우에만 출력합니다.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.Arrays; import java.util.StringTokenizer; public class Main {     static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));     static StringTokenizer st;     static StringBuffer sb = new StringBuffer();     static char list[] = new char[16];     static int L, C, a, b;     static void func(int idx, int cnt, String str) {         if (cnt == L) {             if (a < 1 || b < 2)                 return;             sb.append(str).append("\n");             return;         }         if (idx >= C)             return;         for (int i = idx; i < C; i++) {             if (list[i] == 'a' || list[i] == 'e' || list[i] == 'i' || list[i] == 'o' || list[i] == 'u')                 a++;             else                 b++;             func(i + 1, cnt + 1, str + list[i]);             if (list[i] == 'a' || list[i] == 'e' || list[i] == 'i' || list[i] == 'o' || list[i] == 'u')                 a--;             else                 b--;         }     }     static void input() throws Exception {         st = new StringTokenizer(br.readLine());         L = Integer.parseInt(st.nextToken());         C = Integer.parseInt(st.nextToken());         st = new StringTokenizer(br.readLine());         for (int i = 0; i < C; i++) {             list[i] = st.nextToken().charAt(0);         }         Arrays.sort(list, 0, C);     }     public static void main(String[] args) throws Exception {         input();         func(0, 0, "");         System.out.print(sb.toString());     } } | cs | 
'algorithm > dfs' 카테고리의 다른 글
| boj 15650 N 과 M (2) (0) | 2021.01.26 | 
|---|---|
| boj 15649 N 과 M (1) (0) | 2021.01.26 | 
| boj 2580 스도쿠 (0) | 2021.01.22 | 
| boj 1062 가르침 (0) | 2021.01.22 | 
| boj 9663 N-Queen (0) | 2021.01.22 |