데이터 엔지니어

백준 - [Gold 5] 1759번 암호 만들기 본문

프로그래밍(Programming)/알고리즘(Algorithm)

백준 - [Gold 5] 1759번 암호 만들기

kingsmo 2020. 9. 9. 00:27

문제링크: https://www.acmicpc.net/problem/1759

 

1759번: 암호 만들기

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

www.acmicpc.net


문제 설명

- L: 암호 자릿 수

- C: 알파벳 개수

- C개 알파벳으로 L 자릿 수의 암호를 만들 수 있는 모든 경우의 수를 사전순으로 출력

- 조건 1: 최소 1개의 모음 (a, e, i, o, u)

- 조건 2: 최소 2개의 자음

- 조건 3: 오름차순

- 중복 x 모두 소문자


풀이

python 내장 라이브러리인 combination을 사용하여 해결하였습니다. 처음에는 permutation으로 생각하여 풀었는데 시간 초과가 떴습니다. 생각을 해보니 comb로 모든 perm을 구현 가능하고 이미 오름차순으로 정렬을 한 채로 combination함수를 돌려서 조건1과 2만 체크해주면 되는 문제였습니다.

# 조건 1: 최소 1개의 모음
# 조건 2: 최소 2개의 자음
# 조건 3: 오름차순 정렬
mo = {'a', 'e', 'i', 'o', 'u'}
def check(password):

    j = set(password) - mo
    m = set(password).intersection(mo)
    # 조건1, 2 체크
    if len(j) < 2 or len(m) < 1:
        return False
    else:
        return True


from sys import stdin
from itertools import combinations

stdin = open("input.txt", "r")

# L: 암호 자릿 수
# C: 알파벳 개수
L, C = map(int, stdin.readline().split())

alphabets = stdin.readline().split()
alphabets.sort()


comb = combinations(alphabets, L)

for password in comb:
    if check(password): print(''.join(password))

또 다른 방식으로는 dfs를 사용한 백트래킹으로도 풀 수 있습니다. 이번 문제에서는 더 간단한 방법이 있기 때문에 스킵하겠습니다~

 

코드: github.com/smothly/Algorithm_Solving/blob/master/boj-1759.py

Comments