본문 바로가기

알고리즘 공부

[프로그래머스] 모음 사전 - 파이썬(Python)

문제 설명

 

 

사전에 알파벳 모음 'A', 'E', 'I', 'O', 'U'만을 사용하여 만들 수 있는, 길이 5 이하의 모든 단어가 수록되어 있습니다. 사전에서 첫 번째 단어는 "A"이고, 그다음은 "AA"이며, 마지막 단어는 "UUUUU"입니다.

단어 하나 word가 매개변수로 주어질 때, 이 단어가 사전에서 몇 번째 단어인지 return 하도록 solution 함수를 완성해주세요.

 


 

제한사항

 

 

  • word의 길이는 1 이상 5 이하입니다.
  • word는 알파벳 대문자 'A', 'E', 'I', 'O', 'U'로만 이루어져 있습니다.

 


 

입출력 예

 

 

word result
"AAAAE" 6
"AAAE" 10
"I" 1563
"EIO" 1189

 

 

입출력 예 #1

 

사전에서 첫 번째 단어는 "A"이고, 그다음은 "AA", "AAA", "AAAA", "AAAAA", "AAAAE", ... 와 같습니다. "AAAAE"는 사전에서 6번째 단어입니다.

 

입출력 예 #2

 

"AAAE"는 "A", "AA", "AAA", "AAAA", "AAAAA", "AAAAE", "AAAAI", "AAAAO", "AAAAU"의 다음인 10번째 단어입니다.

 


 

코드 설명

 

 

중복 순열 product를 이용했습니다. 먼저 알파벳 모음(A,E,I,O,U)을 모은 배열 alpha와 모음 사전이 담길 배열 dictionary를 선언했습니다. 반복문을 통해 dictionary에 alpha의 중복 순열 순서쌍 order를 담는데요, 나중에 하나의 문자열로 처리하기 위해 ''.join(order) 형태로 저장합니다.

 

반복문 종료 후에는 dictionary 안의 단어들이 아직 사전 순으로 정렬된 상태가 아니기 때문에 sort() 메소드를 통해 정렬을 실시합니다.

 

이후 주어진 문자열 "word"가 dictionary 안의 몇 번째 문자열인지 알아내 출력하면 되겠습니다.

 

 

from itertools import product
def solution(word):
    answer = 0; num = 1
    alpha = ["A","E","I","O","U"]
    dictionary = []
    for i in range(5) :
        for order in product(alpha,repeat=num) :
            dictionary.append(''.join(order))
        num += 1
        
    dictionary.sort()
    
    for i in range(len(dictionary)) :
        answer += 1
        if word == dictionary[i] :
            break
    
    return answer

 

 

앗, 그런데 마지막 반복문은 굳이 필요없겠죠? Python의 index()를 이용하면 찾고자 하는 단어 word가 사전의 몇 번째 인덱스에 위치해있는지 파악할 수 있습니다.

 

 

from itertools import product
def solution(word):
    num = 1
    alpha = ["A","E","I","O","U"]
    dictionary = []
    for i in range(5) :
        for order in product(alpha,repeat=num) :
            dictionary.append(''.join(order))
        num += 1
        
    dictionary.sort()
    
    answer = dictionary.index(word) + 1
    
    return answer

 

 

또는 등비 수열의 합을 이용한 코드도 있습니다.

 

def solution(word):
    answer = 0
    for i, n in enumerate(word):
        answer += (5 ** (5 - i) - 1) / (5 - 1) * "AEIOU".index(n) + 1
    return answer