코딩테스트/JAVA 코테

[백준] 1759. 암호만들기

박소민 2023. 2. 25. 13:14
1759. 암호만들기
 

1759번: 암호 만들기

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

www.acmicpc.net

 

  • 내 풀이 
    • 예시 테스트케이스를 조건으로 착각하지 않도록 주의할것!
    • 4글자 중 모음 최소 1개, 자음 최소 2개이므로 0<모음<=2 -> 생각했다가 오류
      • -> 테케가 4글자일 뿐 4글자 고정이 아니었다!!!
      • 모음개수, 자음 개수따로 세어서 기준 만들어줘야함

 

package day15_dfs;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.StringTokenizer;

public class JUN1759_ParkSomin {
    static int N,C, moflag, zaflag;
    static String[] str, result;
    static ArrayList<String> mo=new ArrayList<>(Arrays.asList("a","e","i","o","u"));

    public static void main(String[] args) throws IOException {
        //최소 1개의모음 , 최소 2개의 자음
        //알파벳 오름차순 정렬

        BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st= new StringTokenizer(br.readLine());
        //암호: 서로다른 C개의 문자 중 N개로 구성(조합)
        N=Integer.parseInt(st.nextToken());
        C=Integer.parseInt(st.nextToken());

        str=new String[C];
        result=new String[N];

        st=new StringTokenizer(br.readLine());
        for (int i = 0; i < C; i++) {
            str[i]=st.nextToken();
        }
        //오름차순 정렬
        Arrays.sort(str);
        combi(0,0);

    }
    private static void combi(int cnt, int start){
        if(cnt==N){
            moflag=0;
            zaflag=0;
            String answer="";
            for (String a: result) {
                answer+=a;
                if(mo.contains(a)) moflag++;
                else zaflag++;
            }
            //4글자 중 모음 최소 1개, 자음 최소 2개이므로 0<모음<=2 -> 생각했다가 오류
            //말그대로 모음, 자음 따로 개수 세줘야함
            //if (moflag>=1 && zaflag>=2){
            if(moflag>0 && moflag<=2){
                System.out.print(answer);
                System.out.println();
            }
            return;
        }

        for (int i = start; i < C; i++) {
            result[cnt]=str[i];
            combi(cnt+1,i+1);
        }
    }
}