while (1): study();

[백준/1759] 암호 만들기 본문

알고리즘

[백준/1759] 암호 만들기

전국민실업화 2021. 8. 2. 21:56
728x90

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

 

1759번: 암호 만들기

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

www.acmicpc.net


 암호의 순서는 언제나 오름차순 정렬로 고정되어 있으므로, 순서에 대해 고려하지 않아도 됩니다. 따라서 조합(Combination)을 이용하여 간단하게 문제를 풀 수 있습니다. 파이썬 내장 라이브러리 중 하나인 itertools의 combinations 함수를 사용하면 됩니다.

 소스코드는 다음과 같습니다.

from itertools import combinations

l, c = list(map(int, input().split()))
array = input().split()

vowel = ('a', 'i', 'u', 'e', 'o')

array = list(combinations(array, l))
result = []
for i in array:
    v = 0
    for j in i:
        if j in vowel:
            v += 1
    if v >= 1 and l - v >= 2:
        result.append(''.join(sorted(i)))

for i in sorted(result):
    print(i)

 모음이 최소 1개, 자음이 최소 2개 있어야 한다는 제약이 있으므로 먼저 모음을 튜플로 초기화하여 관리하겠습니다. 이후 입력으로 받은 문자들에 대해서 길이 4개짜리 조합을 모두 구합니다. 조합 경우의 수를 순회하며 모음의 개수를 세고, 만약 모음의 개수가 1 이상이고, 자음의 개수(전체 길이에서 모음의 개수를 뺀 것)가 2 이상이라면 result 변수에 삽입합니다. 

 마지막으로 result변수를 오름차순 정렬한 뒤 순회하며 출력하면, 정답을 구할 수 있습니다.

728x90

'알고리즘' 카테고리의 다른 글

[알고스팟] 쿼드트리 뒤집기  (0) 2021.12.28
[알고스팟] 시계 맞추기 (완전탐색과 최적화)  (0) 2021.12.27
[백준/1929] 소수 구하기  (0) 2021.08.02
접두사 합  (0) 2021.08.02
투 포인터  (0) 2021.08.02
Comments