[Algorithm] 백준 1759 - 암호 만들기 in Python(파이썬)

하이초·2022년 8월 15일
0

Algorithm

목록 보기
52/94
post-thumbnail

💡 백준 1759:

모음과 자음의 개수를 지키며 모든 암호 개수 파악하기

🌱 코드 in Python

알고리즘: 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)) # 출력

얼마나 깔끔한가! 조합을 다루는 방식부터 글러먹었다 나는 ㅠㅠ
다음에는 어떤식으로 조합을 꾸리는 것이 좋은지 더 생각해보면 좋을 것 같다


🧠 기억하자

  1. 조합
    • 조합 모듈을 사용하여 풀었는데, 만약 이러한 라이브러리를 사용하지 못할 경우? 어떤식으로 조합을 만들 수 있는지 생각해보는 것이 좋을 것 같다
    • 구현을 게을리하지 말자

백준 1759 바로가기

profile
개발국대가 되는 그 날까지. 지금은 개발 응애.

0개의 댓글