백준|1759번|암호 만들기

JSK·2022년 7월 31일
0

자바 PS풀이

목록 보기
49/51

문제설명
입력받은 문자들을 통해 만들 수 있는 문자열을 출력하는 문제입니다. 문자열은 항상 문자가 순서대로여야하고 최소 모음 1개에 자음 2개가 있어야합니다.

작동 순서
1. 출력할 문자열의 길이와 문자의 개수를 입력받습니다.
2. 문자의 종류를 입력받습니다.
3. 입력받은 문자들을 순서대로 정렬합니다.
4. 문자열에 현재 순서의 문자를 포함하거나 포함하지 않는 2 경우로 탐색을 진행합니다.
5. 문자열의 길이가 채워지면 그 문자에 모음 1개와 자음 2개가 포함되어있는지 확인하고 포함되어 있는 경우 스택에 입력합니다.
6. 탐색이 모두 끝나면 스택에 들어있는 문자열들을 출력합니다.

소스코드

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Arrays;
import java.util.Stack;
import java.util.StringTokenizer;

public class 백준_1759번_암호만들기 {
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static StringBuilder sb = new StringBuilder();
    static StringTokenizer st;

    static Stack<char[]> stack = new Stack<>();

    static int L, C;
    static char[] alphabet;
    public static void main(String[] args) throws IOException {
        st = new StringTokenizer(br.readLine());
        L = Integer.parseInt(st.nextToken());
        C = Integer.parseInt(st.nextToken());

        alphabet = new char[C];
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < C; i++) {
            alphabet[i] = st.nextToken().charAt(0);
        }
        Arrays.sort(alphabet);

        dfs(0,0, new char[L]);
        while(!stack.empty()) sb.append(stack.pop()).append("\n");
        System.out.print(sb);
    }
    static void dfs(int index, int depth, char[] s){
        if(depth==L){
            int vowel=0;
            int consonant =0;
            for (char c : s) {
                if (c == 'a' | c == 'e' | c == 'i' | c == 'o' | c == 'u') vowel++;
                else consonant++;
            }
            if(vowel>=1 & consonant>=2) stack.push(s);
            return;
        }
        if(index>=C) return;
        char[] s2 = new char[L];
        System.arraycopy(s, 0, s2, 0, L);
        s2[depth]=alphabet[index];
        dfs(index+1, depth, s);
        dfs(index+1, depth+1, s2);
    }
}
profile
학사지만 AI하고 싶어요...

0개의 댓글