코테 공부/프로그래머스

[Python] 모음사전 / 중복순열

prefer_all 2023. 1. 8. 15:33

문제

사전에 알파벳 모음 '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

풀이

itertools.product (중복순열)을 사용한다

'''
A,E,I,O,U를 사용해서 길이 5 이하인 단어 모음집
A -> AA -> AAA.. -> UUUUU
word가 사전에서 몇 번째 단어인가
idea: 단어집을 구축하고 몇 번째인지 찾기
중복 순열(itertools product) 
'''
from itertools import product

def solution(word):        
    words = [] # 나올 수 있는 combination을 담는 list
    alphabet = ['A', 'E', 'I', 'O', 'U']
    for i in range(1, 6):
        tmp = list(product(alphabet,repeat=i))
        for i in tmp:
            tmp_word = ''.join(i)
            words.append(tmp_word)
    words.sort()
    return words.index(word) + 1

combinations(조합. 순서가 중요하지 않는 경우)만 주로 사용했었는데 이 문제를 통해 itertools의 순열 함수들도 익힐 수 있었다.

 

📝
product
1. 데카르트 곱

from itertools import product

iterator1 = [1, 2, 3]
iterator2 = ['A', 'B', 'C']

print(list(product(iterator1, iterator2)))
# [(1, 'A'), (1, 'B'), (1, 'C'), (2, 'A'), (2, 'B'), (2, 'C'), (3, 'A'), (3, 'B'), (3, 'C')]

print([(i,j) for i in iterator1 for j in iterator2])
# [(1, 'A'), (1, 'B'), (1, 'C'), (2, 'A'), (2, 'B'), (2, 'C'), (3, 'A'), (3, 'B'), (3, 'C')]


2. 중복순열

from itertools import product

iterator = ['A','B','C','D','E']

print(list(product(iterator, repeat = 1)))
# [('A',), ('B',), ('C',), ('D',), ('E',)]

print(list(product(iterator, repeat = 2)))
# [('A', 'A'), ('A', 'B'), ('A', 'C'), ('A', 'D'), ('A', 'E'), ('B', 'A'), ('B', 'B'), ('B', 'C'), ('B', 'D'), ('B', 'E'), ('C', 'A'), ('C', 'B'), ('C', 'C'), ('C', 'D'), ('C', 'E'), ('D', 'A'), ('D', 'B'), ('D', 'C'), ('D', 'D'), ('D', 'E'), ('E', 'A'), ('E', 'B'), ('E', 'C'), ('E', 'D'), ('E', 'E')]

 

📝
permutation (중복 없는 순열)

from itertools import permutations

iterator = ['A','B','C']

print(list(permutations(iterator)))
# [('A', 'B', 'C'), ('A', 'C', 'B'), ('B', 'A', 'C'), ('B', 'C', 'A'), ('C', 'A', 'B'), ('C', 'B', 'A')]

print(list(permutations(iterator, 2)))
# [('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'C'), ('C', 'A'), ('C', 'B')]