본문 바로가기
알고리즘/백트래킹

백준 1759번 : 암호 만들기 java

by LDY3838 2022. 6. 11.
반응형

이 문제는 데이터를 입력받은 후 dfs를 이용하여 중복된 값이 나오지 않게 탐색하는 알고리즘입니다.

이 문제를 풀 때 조심해야하는 점은 모음이 1개 이상, 자음이 2개 이상 들어가야 한다는 조건입니다.

문자들을 입력받은 후 정렬하여 dfs를 실행하며 모음이 1개 이상, 자음이 2개 이상 들어 있는지 확인하면 되는 문제입니다.

바로 코드를 보여드리도록 하겠습니다.


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

public class Main {
    static char[] charArr;
    static int L, C;
    static char[] answer;
    static boolean[] visited;

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

        L = Integer.parseInt(st.nextToken());
        C = Integer.parseInt(st.nextToken());

        charArr = new char[C];
        answer = new char[L];
        visited = new boolean[C];

        String[] input = br.readLine().split(" ");
        for(int i = 0; i<C; i++)
            charArr[i] = input[i].charAt(0);

        Arrays.sort(charArr);
        dfs(0, 0);
    }
    static void dfs(int idx, int cnt){
        if(cnt == L){
            boolean check = check();
            if(!check)
                return;

            for(int i = 0; i<L; i++)
                System.out.print(answer[i]);
            System.out.println();

            return;
        }

        for(int i = idx; i<C; i++){
            if(!visited[i]){
                visited[i] = true;
                answer[cnt] = charArr[i];
                dfs(i, cnt+1);
                visited[i] = false;
            }
        }
    }

    static boolean check(){
        int aeiou = 0;
        for(int i = 0; i<L; i++){
            switch(answer[i]){
                case 'a':
                case 'e':
                case 'i':
                case 'o':
                case 'u':
                    aeiou++;
            }
        }

        if(aeiou>0 && L-aeiou>1)
            return true;

        return false;
    }
}

이 블로그의 다른 dfs를 이용한 문제들과 유사한 문제였습니다.

반응형

'알고리즘 > 백트래킹' 카테고리의 다른 글

백준 15655번 : N과 M (6) java  (0) 2022.06.22
백준 15666번 : N과 M (12) java  (0) 2022.06.12
백준 15657번 : N과 M (8) java  (0) 2022.06.10
백준 15663번 : N과 M (9) java  (0) 2022.06.03
백준 15654번 : N과 M(5) java  (0) 2022.05.31

댓글