ALGORITHM/프로그래머스 | 백준 | 삼성 | 카카오
[백준] 1795번 암호 만들기 java
SZCODE
2021. 5. 4. 15:37
1759번: 암호 만들기
첫째 줄에 두 정수 L, C가 주어진다. (3 ≤ L ≤ C ≤ 15) 다음 줄에는 C개의 문자들이 공백으로 구분되어 주어진다. 주어지는 문자들은 알파벳 소문자이며, 중복되는 것은 없다.
www.acmicpc.net
문제 풀이 :
백 트래킹을 이용합니다.
주어진 문자 종류 C 가지에서 서로 다른 L개의 알파벳으로 암호를 구하는데 조건을 해결하기 위해서는
1. 문자열을 담은 배열을 정렬 시킵니다.
2. 문자열을 L개 만큼 조합합니다.
3.1 이 때 최소 한 개의 모음과 최소 두개의 자음으로 구성되면 출력해줍니다.
3.2 아니라면 왔던 길을 다시 되돌아가서 새롭게 암호를 조합합니다.
import java.util.Arrays;
import java.util.Scanner;
public class Main{
static int L,C;
static String[] arr;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
L = sc.nextInt();
C = sc.nextInt();
arr = new String[C];
for (int i = 0; i < C; i++) {
arr[i] = sc.next();
}
//1. 정렬
Arrays.sort(arr);
comb(0,"");
}
//2. 최소 모음 1개, 자음 2개
public static void comb(int index, String s) {
if(s.length()==L) {//길이가 L개 이고
if(check(s))//모음 1개, 자음 2개이면 출력한다
System.out.println(s);
return;
}
if(index>=C) return;//arr 배열을 다 돌면 종료
comb(index+1,s+arr[index]);//해당 문자를 포함 시켜 암호를 만든경우
comb(index+1,s);
}
public static boolean check(String s) {
int mo = 0, ja = 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')
mo++;
else
ja++;
}
return mo>=1 && ja>=2;
}
}