알고리즘/백준
BOJ) 암호 만들기
Zin0_0
2020. 7. 18. 21:47
반응형
암호 만들기
1759번: 암호 만들기
첫째 줄에 두 정수 L, C가 주어진다. (3 ≤ L ≤ C ≤ 15) 다음 줄에는 C개의 문자들이 공백으로 구분되어 주어진다. 주어지는 문자들은 알파벳 소문자이며, 중복되는 것은 없다.
www.acmicpc.net
풀이
C 개의 문자 중 L개를 선택해서 만들 수 있는 암호를 출력하는 문제다.
이 때, 암호는 모음(a,e,i,o,u)이 최소 하나 이상 자음이 두개 이상인 조합만 가능하다.
또한, 모든 암호의 경우를 사전순서대로 출력해야한다.
위의 두 조건을 충족하기 위해
C개 중 L개를 선택하는 것은 DFS를, 사전 순서대로 하기 위해 정렬을 선택했다.
DFS이후에 정렬을 하기에는 너무 많은 시간과 메모리를 낭비할 것 같아서 입력 받자마자 정렬을 해주었다.
DFS에서는 index에 따라서 해당 글자가 모음인지 자음인지에 따라 각각 갯수를 세주면서 글자를 담았다.
재귀 호출 도중에 자음과 모음으로 이루어진 비밀번호 조합이 L개가 된다면, return해주었다.
이 때, 모임이 최소 하나 이상이면서 자음이 두개 이상인지 확인하고, 맞으면 답을 출력할 StringBuffer에 append해줬다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.StringTokenizer;
public class Main {
final static String[] vowelArr = {"a","e","i","o","u"};
final static String NEWLINE = "\n";
final static int MIN_VOWEL =1, MIN_CONSONANT=2;
static int l,r;
static String[] wordArr;
static StringBuffer sb;
public static void main(String[] args) throws IOException {
BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
l = Integer.parseInt(st.nextToken());
r = Integer.parseInt(st.nextToken());
wordArr = br.readLine().split(" ");
Arrays.sort(wordArr);
br.close();
solution();
}
private static void solution() {
LinkedList<String> passList = new LinkedList<>();
sb = new StringBuffer();
dfs(0,0,0,passList);
System.out.println(sb.toString());
}
private static void dfs(int idx, int vowel, int consonant, LinkedList<String> passList) {
if(vowel+consonant == l) {
if(vowel >= MIN_VOWEL && consonant >= MIN_CONSONANT) {
for (String str : passList) {
sb.append(str);
}
sb.append(NEWLINE);
}
return;
}
if(idx == r) {
return;
}
for(int i=idx; i<r; i++) {
String now = wordArr[i];
passList.offer(now);
if(now.equals(vowelArr[0]) || now.equals(vowelArr[1]) || now.equals(vowelArr[2]) || now.equals(vowelArr[3]) || now.equals(vowelArr[4])) {
dfs(i+1, vowel+1, consonant, passList);
} else {
dfs(i+1, vowel, consonant+1, passList);
}
passList.pollLast();
}
}
}
반응형