본문 바로가기
알고리즘 문제 풀이/완전탐색

백준 - 암호 만들기

by 가나무마 2021. 12. 12.
728x90

본 알고리즘 풀이는 Routine Study에서 진행하고 있습니다.
저를 포함한 구성원이 대부분 초보이므로, 원하시는분은 언제라도 들어오셔도 좋습니다.

문의는 댓글 바람.

문제 출처 : https://www.acmicpc.net/problem/1759

 

[문제 설명]

1.모음이 1개 이상

2.자음이 2개 이상

3.암호는 알파벳 순서대로

가능한 모든 암호의 경우의 수를 출력하시오

 

[접근 방법]

각 인덱스별로 알파벳이 있나 없나 확인하는 문제.

시간복잡도는 O(2^n)이 된다. 있나 없나 2가지 경우의 수를 n번 반복하므로.

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

class Main {
    static int L,S;
    static char[] charArray;
    static Stack<String> passwordStack = new Stack<>();
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] firstLine = br.readLine().split(" ");
        String[] secondLine = br.readLine().split(" ");
        L = Integer.parseInt(firstLine[0]);
        S = Integer.parseInt(firstLine[1]);
        charArray = new char[S];
        for (int i = 0; i < secondLine.length; i++) {
            charArray[i] = secondLine[i].charAt(0);
        }

        Arrays.sort(charArray);
        makePassword(new StringBuilder(),0,0,0);
        while (!passwordStack.isEmpty()) System.out.println(passwordStack.pop());
    }
    private static void makePassword(StringBuilder sb, int index, int numOfVowels, int numOfConsonants) {
        if (sb.length() == L ) {
            if (numOfVowels >= 1 && numOfConsonants >= 2) passwordStack.add(sb.toString());
            return;
        } else if (index == S || sb.length()+S-index < L) return;     // 배열의 마지막에 도달했거나, 나머지 문자를  모두 추가해도 전체 길이가 L이 안될 때,

        makePassword(sb, index+1, numOfVowels, numOfConsonants);
        if (charArray[index] == 'a' || charArray[index] == 'e' || charArray[index] == 'i' || charArray[index] == 'o' || charArray[index] == 'u') {
            numOfVowels++;
        } else numOfConsonants++;
        makePassword(sb.append(charArray[index]), index+1,numOfVowels,numOfConsonants);
        sb.deleteCharAt(sb.length()-1);
    }
}
728x90
반응형

'알고리즘 문제 풀이 > 완전탐색' 카테고리의 다른 글

백준 - 체스판 다시 칠하기  (0) 2021.12.25
백준 - 유레카 이론  (0) 2021.12.22
백준 - 한수  (0) 2021.12.12
프로그래머스 - 소수 만들기  (0) 2021.11.25
프로그래머스 - 모의고사  (0) 2021.11.12