-
백준 1759번 암호 만들기 :: 마이구미알고리즘 풀이/그래프 2017. 9. 9. 15:04반응형
이 글은 백준 알고리즘 문제 1759번 "암호 만들기" 를 풀이한다.
접근 방법은 백트래킹을 활용해 문제를 풀이한다.
6603번 로또 문제와 흡사하다.
조금 응용된 문제로써, 백트래킹을 잘 모른다면 먼저 참고하길 바란다.
6603번 로또 - http://mygumi.tistory.com/191
문제 링크는 다음과 같다.
https://www.acmicpc.net/problem/1759
DFS, BFS - http://mygumi.tistory.com/102
Github 알고리즘 문제 - https://github.com/hotehrud/acmicpc
바로 어제 최백준 조교가 방 열쇠를 주머니에 넣은 채 깜빡하고 서울로 가 버리는 황당한 상황에 직면한 조교들은, 702호에 새로운 보안 시스템을 설치하기로 하였다. 이 보안 시스템은 열쇠가 아닌 암호로 동작하게 되어 있는 시스템이다.
암호는 서로 다른 L개의 알파벳 소문자들로 구성되며 최소 한 개의 모음과 최소 두 개의 자음으로 구성되어 있다고 알려져 있다. 또한 정렬된 문자열을 선호하는 조교들의 성향으로 미루어 보아 암호를 이루는 알파벳이 암호에서 증가하는 순서로 배열되었을 것이라고 추측된다. 즉, abc는 가능성이 있는 암호이지만 bac는 그렇지 않다.
새 보안 시스템에서 조교들이 암호로 사용했을 법한 문자의 종류는 C가지가 있다고 한다. 이 알파벳을 입수한 민식, 영식 형제는 조교들의 방에 침투하기 위해 암호를 추측해 보려고 한다. C개의 문자들이 모두 주어졌을 때, 가능성 있는 암호들을 모두 구하는 프로그램을 작성하시오.
문제에선 2가지를 짚고 가야한다.
- 최소 한 개의 모음과 최소 두 개의 자음으로 구성.
- 암호는 알파벳이 증가하는 순서로 배열
1번은 탐색한 최종 결과를 통해 확인하면 되는 부분이다.
2번을 통해서 얻을 수 있는 건 증가하는 순서 덕분에 이전 알파벳을 고려할 필요가 없다는 것이다.
먼저 입력 부분을 정렬하면 구현하기 편할 것이다.
로또 문제와 거의 흡사하기 때문에 코드로 설명을 대체하겠다. (설명은 위 링크 참고)
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768static int l, c;static StringBuilder sb = new StringBuilder();static boolean[] visited;static char[] array;private void solve() {l = sc.nextInt();c = sc.nextInt();array = new char[c];for (int i = 0; i < c; i++) {array[i] = sc.next().charAt(0);}Arrays.sort(array);for (int i = 0; i <= c - l; i++) {visited = new boolean[26];dfs(i, 1, "" + array[i]);}System.out.println(sb.toString());}public static void dfs(int v, int cnt, String s) {int idx = array[v] - 'a';visited[idx] = true;if (l == cnt) {if (isSatisfy()) {sb.append(s + "\n");}} else {for (int i = v + 1; i < c; i++) {if (!visited[array[i] - 'a']) {dfs(i, cnt + 1, s + array[i]);}}}// backtrackingvisited[idx] = false;}public static boolean isSatisfy() {int vowel = 0;int consonant = 0;if (visited[0]) ++vowel;if (visited[4]) ++vowel;if (visited[8]) ++vowel;if (visited[14]) ++vowel;if (visited[20]) ++vowel;for (int i = 0; i < 26; i++) {if (i == 0 || i == 4 || i == 8 || i == 14 || i == 20) {continue;}if (visited[i]) {++consonant;}}if (vowel > 0 && consonant > 1) {return true;}return false;}cs 반응형'알고리즘 풀이 > 그래프' 카테고리의 다른 글
백준 2023번 신기한 소수 :: 마이구미 (0) 2017.09.15 백준 2661번 좋은수열 :: 마이구미 (2) 2017.09.09 백준 2580번 스도쿠 :: 마이구미 (4) 2017.09.02 백준 9663번 N-Queen :: 마이구미 (2) 2017.08.17 백준 2026번 소풍 :: 마이구미 (2) 2017.08.15