문제 출처 : https://www.acmicpc.net/problem/1759
1759번: 암호 만들기
첫째 줄에 두 정수 L, C가 주어진다. (3 ≤ L ≤ C ≤ 15) 다음 줄에는 C개의 문자들이 공백으로 구분되어 주어진다. 주어지는 문자들은 알파벳 소문자이며, 중복되는 것은 없다.
www.acmicpc.net
풀이과정
문제의 입력범위가 작으므로 완전탐색 방법으로 해결할 수 있다.
- DFS로 가능한 모든 경우의 수를 만들고 검증 메소드를 사용해서 최소 한 개 이상의 모음과 최소 두 개 이상의 자음을 가진 문자열만 출력하도록 구현했다.
- 문제에서 알파벳이 암호에서 증가하는 순서로 배열된다고 했으므로 입력받은 알파벳을 사전 순으로 정렬 후 경우의 수를 만들면 별도로 순서를 검사할 필요가 없다.
소스코드
더보기
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
static int L, C;
static char[] alpha;
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stringTokenizer = new StringTokenizer(reader.readLine());
L = Integer.parseInt(stringTokenizer.nextToken());
C = Integer.parseInt(stringTokenizer.nextToken());
alpha = new char[C];
stringTokenizer = new StringTokenizer(reader.readLine());
for (int i = 0; i < C; i++) {
alpha[i] = stringTokenizer.nextToken().charAt(0);
}
Arrays.sort(alpha);
for (int i = 0; i <= C - L; i++) {
dfs(i, 1, ""+ alpha[i]);
}
}
private static boolean validation(String s) {
int jaCount = 0; //자음
int moCount = 0; //모음
for(int i=0;i<s.length();i++) {
char c = s.charAt(i);
if(c == 'a' || c == 'e' || c == 'i' || c =='o' || c=='u')
moCount++;
else jaCount++;
}
return moCount >= 1 && jaCount >=2;
}
private static void dfs(int index, int count, String s) {
if(count == L) {
if(validation(s)) {
System.out.println(s);
}
return;
}
for(int i=index+1;i<C;i++) {
dfs(i, count + 1, s + alpha[i]);
}
}
}
'백준온라인저지' 카테고리의 다른 글
1110번 더하기 사이클 (0) | 2020.09.19 |
---|---|
2292번 벌집 (0) | 2020.07.31 |
2193번 이친수 (0) | 2020.07.30 |
10828번 스택 (0) | 2020.05.21 |
4344번 평균은 넘겠지 (0) | 2020.05.21 |