개발하는 두부

[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();
    }
}

 

 

'Algorithm > BOJ' 카테고리의 다른 글

[BOJ] 2016.미팅주선하기  (0) 2022.06.13
[BOJ] 2615.오목 (Java)  (0) 2022.04.21
[BOJ] 12094.A와 B (Java)  (0) 2021.06.10
[BOJ] 10159.저울 (Java)  (0) 2021.05.02
[BOJ] 1043.거짓말 (Java)  (0) 2021.04.30

블로그의 정보

개발하는 두부

뚜부니

활동하기