[BOJ] 1759.암호만들기 (Java)
by 뚜부니
1759번: 암호 만들기
첫째 줄에 두 정수 L, C가 주어진다. (3 ≤ L ≤ C ≤ 15) 다음 줄에는 C개의 문자들이 공백으로 구분되어 주어진다. 주어지는 문자들은 알파벳 소문자이며, 중복되는 것은 없다.
www.acmicpc.net
이 문제는 주어진 C개의 문자를 L 길이의 암호로 만드는 문제이며,
암호는 최소 한 개의 모음과 최소 두 개의 자음을 포함한 정렬된 형태로 만들어야 합니다.
브루트포스를 이용해서 풀면 되는 문제라 편안한 마음으로 풀었네요 😎😎
import java.io.*; import java.util.Arrays; import java.util.StringTokenizer; class Main { static BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); static int L; static int C; static char[] alpha; static boolean[] visited; static void printPassowrd() throws Exception { String answer = ""; for (int i = 0; i < C; i++) if (visited[i]) answer += alpha[i]; System.out.println(answer); } /** checkVowel * * @param alpha 확인하려는 문자 * @return 모음인지 확인 결과 반환 */ static boolean checkVowel(char alpha) { if (alpha == 'a' || alpha == 'e' || alpha == 'i' || alpha == 'o' || alpha == 'u') return true; else return false; } /** createPassword * * @param len 암호 길이 * @param idx for문 시작할 idx 번호 * @param vowel 모음 수 * @param consonants 자음 수 */ static void createPassword(int len, int idx, int vowel, int consonants) throws Exception { // 조건 만족 시 출력 if (len == L) { if (vowel < 1 || consonants < 2) // 조건에 해당하지 않은 경우 반환 return; printPassowrd(); return; } for (int i = idx; i < C; i++) { if (!visited[i]) { visited[i] = true; // 방문한 알파벳 번호 if (checkVowel(alpha[i])) createPassword(len + 1, i + 1, vowel + 1, consonants); else createPassword(len + 1, i + 1, vowel, consonants + 1); visited[i] = false; // 방문 표시 제거 } } } public static void main(String[] args) throws Exception { StringTokenizer st = new StringTokenizer(br.readLine()); L = Integer.parseInt(st.nextToken()); C = Integer.parseInt(st.nextToken()); alpha = new char[C]; // 입력 받은 문자 저장 visited = new boolean[C]; // 방문 여부 표시 st = new StringTokenizer(br.readLine()); for (int i = 0; i < C; i++) alpha[i] = st.nextToken().charAt(0); // 한글자씩 받아와서 char로 변경 Arrays.sort(alpha); // 사전순으로 만들기 위해 sort 시킴 createPassword(0, 0, 0, 0); br.close(); } }
블로그의 정보
개발하는 두부
뚜부니