본문 바로가기
Problem Solving/Baekjoon

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

by graycode 2022. 9. 17.

 문제 링크

 

1759번: 암호 만들기

첫째 줄에 두 정수 L, C가 주어진다. (3 ≤ L ≤ C ≤ 15) 다음 줄에는 C개의 문자들이 공백으로 구분되어 주어진다. 주어지는 문자들은 알파벳 소문자이며, 중복되는 것은 없다.

www.acmicpc.net

 

 풀이 과정

 

 풀이 코드

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {

    static int l, c;
    static char[] code;
    static boolean[] visit;
    static StringBuilder result = new StringBuilder();

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

        l = Integer.parseInt(st.nextToken());
        c = Integer.parseInt(st.nextToken());

        code = new char[c];
        visit = new boolean[c];

        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < c; i++)
            code[i] = st.nextToken().charAt(0);

        Arrays.sort(code);

        recur(0, 0);

        bw.write(result.toString());
        bw.flush();
    }

    private static void recur(int idx, int depth) {
        if (depth == l)
            generate();

        for (int i = idx; i < c; i++) {
            visit[i] = true;
            recur(i + 1, depth + 1);
            visit[i] = false;
        }
    }

    private static void generate() {
        int vow = 0;
        int cons = 0;

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < c; i++) {
            if (visit[i]) {
                sb.append(code[i]);

                if (isVowel(code[i]))
                    vow++;
                else
                    cons++;
            }
        }

        if (vow >= 1 && cons >= 2)
            result.append(sb + "\n");
    }

    private static boolean isVowel(char ch) {
        if (ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u')
            return true;
        else
            return false;
    }

}

댓글