-
[백준] 1759번 : 암호 만들기 - 자바(JAVA)알고리즘/백준 2022. 4. 7. 00:01반응형
https://www.acmicpc.net/problem/1759
1759번: 암호 만들기
첫째 줄에 두 정수 L, C가 주어진다. (3 ≤ L ≤ C ≤ 15) 다음 줄에는 C개의 문자들이 공백으로 구분되어 주어진다. 주어지는 문자들은 알파벳 소문자이며, 중복되는 것은 없다.
www.acmicpc.net
문제 해석
암호로 동작하는 보안시스템을 만드려고 한다.
암호는 서로 다른 L개의 알파벳 소문자들로 구성되며 최소 한개의 모음(a,e,i,o,u)와 최소 두 개의 자음으로 주성되어 있습니다.
암호는 알파벳이 증가하는 순서로 배열됩니다.
위의 규칙을 따르는 암호를 모두 출력하세요
문제 풀이 전 설계
1. R개의 알파벳을 조합을 이용하여 L개를 뽑는다.
2. 모음이 1개이상 자음이 2개이상인 조합들만 StringBuilder에 담아 출력한다. (나머지는 return = 백트레킹)
조합전에 정렬을 한번 해주어야 알파벳이 증가해야 하는 순서로 배열가능
코드
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.StringTokenizer; public class Main_1759_암호만들기 { static char[] alphabet; static int passwordLength, numberOfAlphabet; static StringBuilder sb = new StringBuilder(); public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine(), " "); passwordLength = Integer.parseInt(st.nextToken()); numberOfAlphabet = Integer.parseInt(st.nextToken()); alphabet = new char[numberOfAlphabet]; char[] combinatedArray = new char[passwordLength]; st = new StringTokenizer(br.readLine(), " "); for (int i = 0; i < numberOfAlphabet; i++) { alphabet[i] = st.nextToken().charAt(0); } Arrays.sort(alphabet); combination(0, 0, combinatedArray); System.out.println(sb); } static void combination(int cnt, int start, char[] combinatedArray) { if (cnt == passwordLength) { if (!isValid(combinatedArray)) { return; } String temp = new String(combinatedArray); sb.append(temp + "\n"); return; } for (int i = start; i < numberOfAlphabet; i++) { combinatedArray[cnt] = alphabet[i]; combination(cnt + 1, i + 1, combinatedArray); } } private static boolean isValid(char[] combinatedArray) { int vowelsCount = 0; int nonVowelsCount = 0; for (char e : combinatedArray) { if (isVowels(e)) { vowelsCount++; continue; } nonVowelsCount++; } if (vowelsCount < 1 || nonVowelsCount < 2) { return false; } return true; } private static boolean isVowels(char tempAlphabet) { return (tempAlphabet == 'a' || tempAlphabet == 'e' || tempAlphabet == 'i' || tempAlphabet == 'o' || tempAlphabet == 'u'); } }
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 15686번 : 치킨 배달 - 자바(JAVA) (0) 2022.04.12 [백준] 14719번 : 빗물 - 자바(JAVA) (0) 2022.04.10 [백준] 3055번 : 탈출 - 자바(JAVA) (0) 2022.04.05 [백준] 15666번 : N과 M(12) - 자바(JAVA) (0) 2022.04.04 [백준] 1987번 : 알파벳 - 자바(JAVA) (0) 2022.04.02