https://www.acmicpc.net/problem/1759
- 풀이
주어진 문자 C개 중 L개를 뽑은 뒤 정렬하면 되기 때문에 조합을 사용한다. 초기 문자열을 정렬하고, 재귀 함수를 이용해 자신보다 인덱스가 큰 문자들만 탐색하며 암호를 찾아나간다. 찾은 암호에 모음이 1개, 자음이 2개 이상 있는지 확인한 뒤 출력한다.
- 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
static char[] arr; // 알파벳 배열
static int L, C;
static boolean isSelected[];
static void findPW(int r, int start) {
if (r==L) {
StringBuilder sb = new StringBuilder();
int v=0, c=0; //모음, 자음 개수
for(int i=0; i<C; i++) {
if (isSelected[i]==true) {
if (arr[i]=='a'||arr[i]=='e'||arr[i]=='i'||arr[i]=='o'||arr[i]=='u') v++;
else c++;
sb.append(arr[i]);
}
}
if (v>=1 && c>=2) System.out.println(sb);
return;
}
for(int i=start;i<C; i++) {
if (isSelected[i]==true) continue;
isSelected[i] = true;
findPW(r+1, i);
isSelected[i] = false;
}
}
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(bf.readLine());
L = Integer.parseInt(st.nextToken());
C = Integer.parseInt(st.nextToken());
arr = new char[C];
isSelected = new boolean[C];
// 알파벳 입력
st = new StringTokenizer(bf.readLine());
for (int i = 0; i<C; i++) {
arr[i] = st.nextToken().charAt(0);
}
// 알파벳 정렬
Arrays.sort(arr);
findPW(0, 0);
}
}
'개발 > 코딩테스트' 카테고리의 다른 글
백준 15650번: N과 M(2) [JAVA] (0) | 2023.03.15 |
---|---|
백준 2960번: 도영이가 만든 맛있는 음식 [JAVA] (0) | 2023.03.15 |
백준 17608번: 막대기 [JAVA] (1) | 2023.03.15 |
백준 2164번: 카드2 [JAVA] (0) | 2023.03.15 |
백준 1158번: 요세푸스 문제 [JAVA] (0) | 2023.03.15 |
댓글