https://www.acmicpc.net/problem/1759
1759번: 암호 만들기
첫째 줄에 두 정수 L, C가 주어진다. (3 ≤ L ≤ C ≤ 15) 다음 줄에는 C개의 문자들이 공백으로 구분되어 주어진다. 주어지는 문자들은 알파벳 소문자이며, 중복되는 것은 없다.
www.acmicpc.net
백트래킹으로 DFS를 응용했다.
조합으로 길이가 L인, 최소 한 개의 모음과 최소 두 개의 자음이 포함된 암호를 만든다.
시간제한이 넉넉했기 때문에 한 암호를 만들고 모음이 한 개 이상이고 자음이 두 개 이상인지 체크했다.
public class Main {
static int L;
static int C;
public static void main(String[] args) throws IOException {
System.setIn(new FileInputStream("src/P1759/input.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
L = Integer.parseInt(st.nextToken());
C = Integer.parseInt(st.nextToken());
ArrayList<Character> arr = new ArrayList<>();
st = new StringTokenizer(br.readLine());
for(int i=1; i<=C; i++){
arr.add(st.nextToken().charAt(0));
}
Collections.sort(arr); // 사전순 정렬
for(int i=0; i<arr.size(); i++){
StringBuilder sb = new StringBuilder();
sb.append(arr.get(i));
DFS(i, arr, sb);
}
}
public static void DFS(int index, ArrayList<Character> arr, StringBuilder sb){
if(sb.length()==L){
int l = 0, r = 0;
for(char c:sb.toString().toCharArray()){
if(c=='a'||c=='e'||c=='i'||c=='o'||c=='u') l++;
else r++;
}
// 자음, 모음 개수 체크
if(l>=1 && r>=2) System.out.println(sb.toString());
return;
}
for(int i=index+1; i<arr.size(); i++){
sb.append(arr.get(i));
DFS(i, arr, sb);
sb.deleteCharAt(sb.length()-1);
}
}
}
'알고리즘' 카테고리의 다른 글
[백준 - 1202] 보석 도둑 - Java (0) | 2022.02.07 |
---|---|
[백준 - 2096] 내려가기 - Java (0) | 2022.02.07 |
[백준 - 1806] 부분합 - Java (0) | 2022.02.07 |
[백준 - 3055] 탈출 - Java (0) | 2022.02.07 |
2021 KAKAO BLIND RECURUITMENT 메뉴 리뉴얼 (0) | 2021.07.22 |