함량 100%

함지의 개발일기

알고리즘/브루트포스

[백준/브루트포스] 1769 암호만들기(Python, 파이썬)

Haamjee 2021. 5. 19. 18:16

 

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

 

1759번: 암호 만들기

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

www.acmicpc.net

 

이 문제의 조건은 다음과 같다.

 

  1. 암호의 길이는 L이다.
  2. 암호는 C 개의 알파벳으로만 이루어진다.
  3. 최소 한 개의 모음과 최소 두 개의 자음이 포함되어 있어야한다.

 

3번의 조건을 맞추기 위해 check를 만들었다.

check 함수는 자음과 모음 갯수를 세서 3번 조건에 맞는지 확인하는 함수이다.

 

import sys
input = sys.stdin.readline

def check(password):
    ja = 0 # 자음 갯수
    mo = 0 # 모음 갯수

    for x in password:
        if x in 'aeiou':
            # 해당 password에 모음 갯수 세기
            mo += 1 
        else:
            # 해당 password에 자음 갯수 세기
            ja += 1

    # 최소 한 개의 모음과 최소 두개의 자음이 포함 되어 있다면 True
    return ja >= 2 and mo >= 1

def go(n, alpha, password, i):
    if len(password) == n:
        if check(password):
            print(password)
            return
    
    if i == len(alpha):
        return

    # i 번째 알파벳을 사용하는 경우
    go(n, alpha, password+alpha[i], i+1)

    # i 번째 알파벳을 사용하지 않는 경우
    go(n, alpha, password, i+1)


# L: 암호의 길이 C: 주어지는 알파벳 수
L, C = map(int, input().split())
c_arr = input().split()

# 정렬
c_arr.sort()

go(L, c_arr, "", 0)