Home [BOJ 1759] 암호 만들기
Post
Cancel

[BOJ 1759] 암호 만들기

암호 만들기 (1759번)

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

풀이방법

  • 재귀를 이용해 문제를 해결할 수 있다.
  • 문제 내용 중 암호를 이루는 알파벳이 증가하는 순서로 배열되었을 것이라고 하였으므로 입력받은 C개의 문자들을 정렬해주었다.
  • 최소 한 개의 모음과 최소 두 개의 자음으로 구성되어 있다고 하였으므로 자음과 모음의 개수를 세고 조건에 맞을 경우 출력해주어야 한다.
  • 자음과 모음을 판단하는 checkVowel함수를 만들고 모음일 경우 true, 자음일 경우 false를 반환하도록 하였다.
  • 중복되지 않는 순열을 구하는 방법으로 정답을 구할 수 있다.
  • solve함수의 매개변수는 아래와 같다.
    • arr : 입력받은 문자 C개를 정렬한 배열
    • vowelCount : 모음의 개수
    • consonantCount : 자음의 개수
    • curIndex : 중복을 뽑지 않으며 증가하는 순서대로 뽑기 위한 변수
    • r : 뽑을 개수
    • c : 현재 뽑은 개수 및 result 배열에 들어갈 위치 지정
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
    private static StringBuilder sb = new StringBuilder();
    private static char[] result = null;

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

        int L = Integer.parseInt(st.nextToken());
        result = new char[L];
        int C = Integer.parseInt(st.nextToken());
        char[] arr = new char[C];
        st = new StringTokenizer(br.readLine());
        int index = 0;
        while (st.hasMoreTokens()) {
            arr[index++] = st.nextToken().charAt(0);
        }

        Arrays.sort(arr);

        solve(arr, 0, 0, 0, L, 0);
        System.out.println(sb);
    }

    private static void solve(char[] arr, int vowelCount, int consonantCount, int curIndex, int r, int c) {
        if (c == r) {
            if (vowelCount >= 1 && consonantCount >= 2) {
                sb.append(result).append('\n');
            }
            return;
        }
        else {
            for(int i=curIndex; i<arr.length; i++){
                result[c] = arr[i];
                if (checkVowel(arr[i])) {
                    solve(arr, vowelCount+1, consonantCount, i+1, r, c+1);
                }
                else {
                    solve(arr, vowelCount, consonantCount+1, i+1, r, c+1);
                }
            }
        }
    }

    private static boolean checkVowel(char c) {
        if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u') {
            return true;
        }

        return false;
    }
}

This post is licensed under CC BY 4.0 by the author.

[BOJ 5565] 영수증

[BOJ 4375] 1

Comments powered by Disqus.