파이썬 알고리즘 184번 | [백준 1759번] 암호만들기 - 브루트포스

Yunny.Log ·2022년 6월 24일
0

Algorithm

목록 보기
187/318
post-thumbnail

184. 암호 만들기

1) 어떤 전략(알고리즘)으로 해결?

  • 브루트 포스
  • for문을 마구마구 돌려돌려
  • 조합도 활용해

2) 코딩 설명

  • 모음은 하나, 자음은 두개가 꼭 있어야 함
  • 그래서 모음의 조합을 꺼내줄 때
    • l이 4라면 모음은 자음이 두개 이상 나올 수 있는 1개 혹은 2개로 조합구해줘야 함
    • 5라면 모음은 자음이 두개 이상 나올 수 있는 1,2,3 개 조합을 구해줘야 함
  • 즉 암호의 길이가 l개라면 모음은 최소 1부터 l-2개까지 의 조합 경우를 구해야 함
  • 그렇게 각 조합의 경우를 구해서 이를 합쳐주는 과정을 거침 ~ nice

<내 풀이>


from operator import indexOf
import sys
from itertools import combinations
# L개의 알파벳 소문자로 이뤄진 암호
# C개의 알파벳 제공 
l,c = map(int, sys.stdin.readline().rstrip().split())
lis = list(sys.stdin.readline().rstrip().split())

# 최소 한 개의 모음(a, e, i, o, u)
# 최소 두 개의 자음
mo = ['a', 'e', 'i', 'o', 'u']

lismo = [] # lis 내 모음

liscpy = lis.copy() #본래 lis 에서 pop 할 예정이라 하나 더 복사해둔 것임 

for i in range(c) :
    if liscpy[i] in mo : 
        lismo.append(lis.pop(lis.index((liscpy[i])))) 
        
# 위 for 문을 돌고나면 lis 에는 자음만 남게 된다.

totallis = []
# 총 문자열 담을 리스트 선언

# 모음 가능한 최대 갯수는 l-2
for i in range(1, l-1) : #자음이 두개는 들어가야 해서
    lismocomb = []
    lisjacomb = []
    lismocomb.append(list(combinations(lismo,i)))
    lisjacomb.append(list(combinations(lis,l-i)))
    
    # print("\n i번째, " ,i, l-i)
    # print(list(lismocomb))
    # for k in lismocomb :
    #     print("mo", k)
    # print(list(lisjacomb))
    # for j in lisjacomb :
    #     print("ja", j)

    for k in lismocomb :
        for kk in k : 
            for j in lisjacomb :
                for jj in j :
                    res=list(kk+jj)
                    res.sort()
                    totallis.append("".join(res))

totallis.sort()

for i in totallis :
    print(i)
    

<반성 점>

  • combination 안에 여러 조합이 있어서 여러 for문을 통해서 각 하나하나의 튜플을 꺼내줘야 했다!

<배운 점>

0개의 댓글