백준1759(파이썬) - 암호만들기

resilient

·

2021. 7. 16. 13:03

728x90
반응형

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

 

1759번: 암호 만들기

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

www.acmicpc.net

  • 먼저 이 문제 입력값의 최대가 15이기 때문에 combinations를 쓸 수 있겠다고 생각했다.
  • 모음 집합을 만들어서 나중에 모음이거나 자음이거나를 판별할때 set자료형을 사용했다.
  • 암호는 순서대로 만들어지므로, data를 정렬해준다.
  • function 함수를 만들어서 변수로 들어오는 password에서 모음을 제외한 set자료형인 except_vowel_password를 만들어줬고 password에 어떤 모음이 들어 있는지를 알기 위해 &를 사용해서 교집합인 원소를 구한뒤 intersection_vowel_password에 담아주었다.
  • 그 이후로 최소 한개의 모음과 2개의 자음이 들어가야 하므로 만약에 이 갯수가 충족되지 않을 시, flag를 1로 변경해준다.
  • 주어지는 입력값인 data로 combinations를 사용해서 조합을 구해주고 function의 변수로 넣어주고 그 값(함수의 return 값인 flag값)이 0일경우(충족될경우) 출력을 해주면된다.
import sys
from itertools import combinations
input = sys.stdin.readline

l,c = map(int,input().split())
data = list(input().split())
vowel = {"a","e","i","o","u"}
data.sort()

def function(password):
    except_vowel_password = set(password) - vowel
    intersection_vowel_password = set(password) & vowel
    flag = 0
    if len(except_vowel_password) < 2 or len(intersection_vowel_password) <1:
        flag = 1
    return flag

for comb in combinations(data,l):
    if function(comb) == 0:
        print(''.join(comb))
반응형