모음과 자음의 개수를 지키며 모든 암호 개수 파악하기
알고리즘: Brute Force
from itertools import combinations
l, c = map(int, input().split())
g = input().split()
g.sort()
com = list(combinations(range(c), l))
for i in com:
w_c = l # 비밀번호의 총 길이
v_c = 1 # 최소 모음 개수
c_c = 2 # 최소 자음 개수
ret = []
for j in i:
if g[j] == 'a' or g[j] == 'e' or g[j] == 'i' or g[j] == 'o' or g[j] == 'u': # 모음이면
if w_c <= c_c: # 남은 비밀번호의 자리보다 자음 최소 개수가 많을 경우
break # 브레이크
ret.append(g[j]) # 아닐 경우 어펜드
w_c -= 1 # 자리수 감소
v_c -= 1 # 필요 모음 개수 감소
else: # 자음이면
ret.append(g[j]) # 어펜드
w_c -= 1 # 자리수 감소
c_c -= 1 # 필요 자음 개수 감소
if not w_c and v_c != 1: # 모든 자릿수를 다 채웠고, 모음이 1개 이상이면
print(''.join(ret)) # 출력
이번 문제 역시 조합을 통해 풀 수 있는 문제였다
끄응.. 근데 맨날 너무 직관적으로 떠오르는 코드밖에 못짜는 것 같다..
나는 조합을 인덱스로 접근하다보니 좀 더 지저분해진 게 있는 것 같다
너무 하드코딩 느낌 나 ㅠㅠ
그래서 좀 찾아보고 내가 원하는 스타일의 코드를 찾게 되었다
from itertools import combinations
l, c = map(int, input().split())
g = input().split()
g.sort()
com = list(combinations(g, l)) # 패스워드의 문자열 조합을 만들기
v = ['a', 'e', 'i', 'o', 'w']
for pwd in com:
v_c = 0
for i in pwd: # 패스워드를 순회하며
if i in v: # 모음이면
v_c += 1 # 모음 개수 중가
if 1 <= v_c <= l - 2: # 모음 개수가 1개 이상이면서 자음이 최소 2개이상 포함되는 경우만
print(''.join(pwd)) # 출력
얼마나 깔끔한가! 조합을 다루는 방식부터 글러먹었다 나는 ㅠㅠ
다음에는 어떤식으로 조합을 꾸리는 것이 좋은지 더 생각해보면 좋을 것 같다