728x90
1759번: 암호 만들기
첫째 줄에 두 정수 L, C가 주어진다. (3 ≤ L ≤ C ≤ 15) 다음 줄에는 C개의 문자들이 공백으로 구분되어 주어진다. 주어지는 문자들은 알파벳 소문자이며, 중복되는 것은 없다.
www.acmicpc.net
파이썬 itertools 라이브러리의 combinations를 써서 풀었다.
통과는 했으나 4중 for문까지 들어가므로 성능이 별로라고 생각한다.
자음이 2개 이상 들어가야 한다는 조건을 빼먹어서 틀렸다.
고치니 바로 정답!
내 풀이
# 기타 알고리즘_B_2_암호 만들기
import itertools
l,c = map(int, input().split())
temp_list = list(input().split()) # 알파벳 종류 ㅣㅇㅂ력받기
consonants = [] # 자음
vowels = [] # 모음
result = [] # 암호들 들어갈 리스트
# 자음, 모음 리스트 분리
for char in temp_list:
if char == 'a' or char == 'e' or char == 'i' or char == 'o' or char == 'u':
vowels.append(char)
else:
consonants.append(char)
word = ''
for i in range(1, len(vowels) + 1): # 모음은 최소 1개 들어가야 하므로
if (l-i >= 2): # 자음은 최소 2개 들어가야 하므로
for x in itertools.combinations(vowels, i):
for y in itertools.combinations(consonants, l-i):
for char in sorted(x+y): # x+y 리스트를 정렬한 후 각 character를
word += char # word 변수에 하나씩 추가
result.append(word) # 결과값을 저장하는 result 리스트에 저장
word='' # word 변수 초기화
for i in sorted(result): # 알파벳 순으로 암호를 출력
print(i)
책에 있는 풀이가 훨씬 간단하다.
책에서는 길이가 l인 모든 암호 조합을 확인한 뒤에, 최소 1개의 모음과 최소 2개의 자음이 있는 경우를 출력한다.
# 기타 알고리즘_B_2_암호 만들기
from itertools import combinations
vowels = ('a', 'e', 'i', 'o', 'u') # 5개의 모음 정의
l, c = map(int, input().split())
# 가능한 암호를 사전식으로 출력해야 하므로 입력 이후에 정렬 수행
array = input().split(' ')
array.sort()
# 길이가 l인 모든 암호 조합을 확인
for password in combinations(array, l):
# 패스워드에 포함된 각 문자를 확인하며 모음의 개수를 세기
count = 0
for i in password:
if i in vowels:
count += 1
# 최소 1개의 모음과 최소 2개의 자음이 있느니 경우 출력
if count >= 1 and count <= l - 2:
print(''.join(password))
가독성이 훨씬 좋다.
여기서 join함수는 리스트에 포함되어 있는 문자열들을 새로운 문자열로 합치는 함수이다.
또한 합칠 때, 중간에 문자열을 삽입할 수 있다.
예를 들어 ":".join(["23", "59", "58"])는 "23:59:58"이 된다.
728x90
'알고리즘 > 백준' 카테고리의 다른 글
2447번: 별 찍기 - 10 (0) | 2023.02.28 |
---|---|
9020번: 골드바흐의 추측 (0) | 2023.02.20 |
2839번: 설탕 배달 (0) | 2023.02.20 |
18406번: 럭키 스트레이트 (0) | 2023.02.08 |
1439번: 문자열 뒤집기 (0) | 2023.01.26 |