지우너

[BOJ] 1759 java 본문

Problem Solving

[BOJ] 1759 java

지옹 2025. 1. 4. 22:50

문제

https://www.acmicpc.net/problem/1759

 

풀이

알파벳 조합(backtracking())을 만들어서 모음1개, 자음 2개를 검사(check())하면 되는 문제

조합을 만드는 문제니까 백트래킹 사용

주어진 알파벳 목록을 정렬한 후 idx 뒤의 문자부터 배열에 넣으면 자동으로 정렬이 됨

 

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {

    public static int l;
    public static int c;
    public static char[] alphabets;
    public static boolean[] visited;
    public static char[] result;
    public static StringBuilder sb = new StringBuilder();

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

        // 새 보안 시스템에서 조교들이 암호로 사용했을 법한 문자의 종류는 C가지가 있다
        // 첫째 줄에 두 정수 L, C가 주어진다. (3 ≤ L ≤ C ≤ 15)
        StringTokenizer st = new StringTokenizer(br.readLine());
        l = Integer.parseInt(st.nextToken());
        c = Integer.parseInt(st.nextToken());
        alphabets = new char[c];
        visited = new boolean[c];
        result = new char[l];

        // 다음 줄에는 C개의 문자들이 공백으로 구분되어 주어진다. 주어지는 문자들은 알파벳 소문자이며, 중복되는 것은 없다
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < c; i++) {
            String tmp = st.nextToken();
            alphabets[i] = tmp.charAt(0);
        }
        br.close();

        // 암호를 이루는 알파벳이 증가하는 순서로
        // 즉, abc는 가능성이 있는 암호이지만 bac는 그렇지 않다.
        Arrays.sort(alphabets);

        // C개의 문자들이 모두 주어졌을 때, 가능성 있는 암호들을 모두 구하는 프로그램
        backtracking(0,0);

        System.out.println(sb);
    }


    public static void backtracking(int idx, int cnt){
        // (조건1) 암호는 서로 다른 L개의 알파벳 소문자들로 구성
        if(cnt==l){
            if(check()) {
                for (char c : result) {
                    sb.append(c);
                }
                sb.append('\n');
            }
            return;
        }

        for (int i = idx; i < c; i++) {
            if(visited[i]) continue;
            result[cnt] = alphabets[i];
            visited[i] = true;
            backtracking(i,cnt+1);

            visited[i]=false;
        }
    }

    public static boolean check(){
        char[] vowels = {'a', 'e', 'i', 'o', 'u'};
        int numOfVowel = 0;
        for (char c : result) {
            for (char vowel : vowels) {
                if(c==vowel) numOfVowel++;
            }
        }

        // (조건2) 최소 한 개의 모음(a, e, i, o, u) && 최소 두 개의 자음으로 구성
        return numOfVowel>=1 && l-numOfVowel>=2;
    }
}

'Problem Solving' 카테고리의 다른 글

[BOJ] 1987 java  (0) 2025.01.05
[BOJ] 3108 java  (1) 2025.01.03
[BOJ] 1963 java  (0) 2025.01.03
[BOJ] 1476 JAVA  (0) 2024.12.30
[BOJ] 4963 JAVA  (0) 2024.12.17