본문 바로가기
Beakjoon&프로그래머스/Java

[백준/Java] 1759번 암호 만들기

by 현장 2026. 1. 26.

-Code

import java.io.*;
import java.util.*;

public class BOJ1759 {
    static char[] vowels = {'a', 'e', 'i', 'o', 'u'};
    static char[] chars;

    public static void main(String[] args) throws IOException {
        BufferedReader br =
                new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int len = Integer.parseInt(st.nextToken());
        int cnt = Integer.parseInt(st.nextToken());

        st = new StringTokenizer(br.readLine());
        chars = new char[cnt];
        for (int i = 0; i < cnt; i++) {
            chars[i] = st.nextToken().charAt(0);
        }

        Arrays.sort(chars);

        DFS(0, len, new StringBuilder());
    }

    private static void DFS(int start, int len, StringBuilder sb) {
        // 길이가 주어진 값과 같고 조건에 맞으면 값 출력
        if (sb.length() == len) {
            if (isOk(sb)) {
                System.out.println(sb);
            }
            return;
        }

        for (int i = start; i < chars.length; i++) {
            sb.append(chars[i]);
            DFS(i + 1, len, sb);
            sb.deleteCharAt(sb.length() - 1);
        }
    }
    // 모듬 1개 이상 자음 2개 이상인지 확인
    private static boolean isOk(StringBuilder sb) {
        int vowelCnt = 0;
        for (char vowel : vowels) {
            for (char ch : sb.toString().toCharArray()) {
                vowelCnt += vowel == ch ? 1 : 0;
            }
        }
        return (vowelCnt >= 1) && (sb.length() - vowelCnt >= 2);
    }
}

로직의 큰 틀은 맞았으나 조건 계산을 못 봐서 빼먹은 부분과 다음 단어 체크에 넘어갈 때, i + 1로 넘겨야 하는데 start +1로 잘못 넘기는 실수를 해서 이 두 부분을 고쳐서 해결했습니다.