사전에 알파벳 모음 'A', 'E', 'I', 'O', 'U'만을 사용하여 만들 수 있는, 길이 5 이하의 모든 단어가 수록되어 있습니다. 사전에서 첫 번째 단어는 "A"이고, 그다음은 "AA"이며, 마지막 단어는 "UUUUU"입니다.
단어 하나 word가 매개변수로 주어질 때, 이 단어가 사전에서 몇 번째 단어인지 return 하도록 solution 함수를 완성해주세요.
제한사항
두 가지 입력 예시를 통해 문제를 어떻게 풀어야 할지 생각해보자.
#1
입력(word): "AAAAE"
출력(result): 6
사전에서 첫 번째 단어는 "A"이고, 그다음은 "AA", "AAA", "AAAA", "AAAAA", "AAAAE", ... 와 같습니다. "AAAAE"는 사전에서 6번째 단어입니다.
#2
입력(word): "AAAE"
출력(result): 10
"AAAE"는 "A", "AA", "AAA", "AAAA", "AAAAA", "AAAAE", "AAAAI", "AAAAO", "AAAAU"의 다음인 10번째 단어입니다.
from itertools import product # 중복순열
def solution(word):
lst = list()
for i in range(1,6):
for j in product(['A','E','I','O','U'], repeat = i):
lst.append(''.join(j))
lst.sort() # 문자정렬
return lst.index(word)+1
중복을 허용한 순열을 통해 문제를 풀 수 있다. (product와 repeat)
i가 1일 때: A, E, I, O, U로 만든 순열 ➡️ A, E, I, O, U
i가 2일 때: A, E, I, O, U로 만든 순열 ➡️ AA, AE, AI, AO, AU, EE, EI, ...
i가 3일 때: A, E, I, O, U로 만든 순열 ➡️ AAA, AAE, AAI, AAO, AEA, AEI, AEO, ...
...
join을 통해 문자 리스트들을 하나의 문자열로 바꿔주고 lst에 저장한다.
''.join(['A'],['E'])는 'AE'이다.
sort()함수를 이용하면 문자가 알파벳 순으로 정렬된다.
이후, 해당 word값이 몇 번째인지 찾아 1을 더하고 정답을 출력한다.
from itertools import product
# lambda를 이용한 solution 함수
solution = lambda word: sorted([''.join(j) for i in range(5) for j in product('AEIOU', repeat=i+1)]).index(word)+1
lambda 표현식
- 함수를 한 줄로 표기할 때 쓰인다.
lambda 매개변수 : 표현식
sort함수와 sorted 함수 차이
- sorted 함수는 정렬된 새로운 리스트를 리턴한다.
- sort 메소드는 아무것도 리턴시켜주지 않는다. (None을 리턴)