암호만들기 : https://www.acmicpc.net/problem/1759
숏코드 : https://www.acmicpc.net/source/6546925
숏코드 참조 후 개선한 점.
1. combi 배열을 사용하지 않고, String pwd에 결과를 누적하여 조합을 생성.
2. HashMap의 contains 메소드를 활용하여 모음의 유무를 체크했던 것을 if문을 통해 간단하게 구현.
=>성능상 이점이 있는 것은 아니지만 간단히 if문을 통해 검사할 수 있는 부분을 생각해내지 못했음.(시간 오래걸림)
추가사항:
1. 조합을 구할 때 반드시 start 가 param으로 있어야 한다는 점을 잊어버림.
start 사용하지 않을 경우, 요소가 중복되므로 조합의 요건을 갖추지 못할 뿐더러 비효율적임.
start를 통해 for루프 내의 index에 대한 컨트롤이 가능해짐.(중복제거)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashSet;
import java.util.StringTokenizer;
public class Main {
static int L, C;
static char[] arr;
private static boolean DBG = false;
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());
C = Integer.parseInt(st.nextToken());
arr = new char[C];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < C; ++i) {
arr[i] = st.nextToken(" ").charAt(0);
}
Arrays.sort(arr);
map = new HashSet<>();
map.add('a');
map.add('e');
map.add('i');
map.add('o');
map.add('u');
if (DBG)
System.out.println(new String(arr));
char[] combi = new char[L];
dfs(0, 0, combi);
}
static HashSet<Character> map;
private static void dfs(int idx, int start, char[] comb) {
if (idx == L) {
boolean flag =false;
int cnt =0;
if (DBG) {
for (char c : comb)
System.out.print(c);
System.out.println();
}
for (char c : comb) {
if(map.contains(c)) {
flag = true;
} else {
cnt++;
}
}
if(flag && cnt >=2)
System.out.println(new String(comb));
} else {
for (int i = start; i < C; i++) {
comb[idx] = arr[i];
dfs(idx + 1, i + 1, comb);
}
}
}
}
https://www.acmicpc.net/source/6546925
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashSet;
import java.util.StringTokenizer;
public class Main {
static int L, C;
static char[] arr;
private static boolean DBG = false;
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());
C = Integer.parseInt(st.nextToken());
arr = new char[C];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < C; ++i) {
arr[i] = st.nextToken(" ").charAt(0);
}
Arrays.sort(arr);
dfs(0, 0, "");
}
private static void dfs(int idx, int start, String pwd) {
if (idx == L) {
int mo = 0;
int ja = 0;
for (char c : pwd.toCharArray()) {
if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u') {
mo++;
} else {
ja++;
}
}
if (mo >= 1 && ja >= 2)
System.out.println(pwd);
} else {
for (int i = start; i < C; i++) {
dfs(idx + 1, i + 1, pwd + arr[i]);
}
}
}
}