문제 설명
사전에 알파벳 모음 '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번째 단어입니다.
입출력 예 #3
"I"는 1563번째 단어입니다.
입출력 예 #4
"EIO"는 1189번째 단어입니다.
나의 풀이
[Python(파이썬)]
from itertools import product
def solution(word):
wordlist = ['A','E','I','O','U'] # 문자 종류
productlist = ['A','E','I','O','U'] # 사전
for i in range(2,6):
# 데카르트 곱 (2부터 문자의 종류 개수만큼), 튜플 -> list형태로
temp = list(map(list, product(wordlist, repeat=i)))
for j in range (len(temp)): # 이차원 리스트를 str 일차원 리스트로 변환
productlist.append(''.join(temp[j]))
productlist.sort() # 사전 순 정렬
return productlist.index(word)+1 # 인덱스는 0번 부터라 +1 해주기
학습한 내용
풀이 과정
1. 사전 만들기
2. 리스트 안 튜플
3. 정렬
1. 사전 만들기
사전을 만들기 위해 데카르트의 곱, 순열, 조합 중에서 데카르트의 곱을 선택했다.
>>> from itertools import product, permutations, combinations
>>> test = ['A','B']
# product 데카르트의 곱
>>> list(product(test, repeat=2))
[('A', 'A'), ('A', 'B'), ('B', 'A'), ('B', 'B')]
# permutations 순열 - 순서 고려해 나열
>>> list(permutations(test,2))
[('A', 'B'), ('B', 'A')]
# combinations 조합 - 순서 고려하지 않음
>>> list(combinations(test,2))
[('A', 'B')]
위를 보면 'A', 'B' 두 문자를 데카르트의 곱, 순열, 조합을 했을 때
데카르트의 곱은 순서와 중복을 모두 허용하면서 모든 경우의 수를 전부 구해준다.
순열은 순서만 고려해 나열하고 조합은 순서도 고려하지 않기 때문에 이 문제에서 적합한 것은 Product라 생각했다.
[Python] itertools - 순열, 조합, product
순열(Permutation) 서로 다른 n개 중에서 r개를 취하여 그들을 일렬로 세울 때, 하나하나를 n개 중에서 r개 취한 순열 (= 서로 다른 n 개 중 r 개를 골라 순서를 고려해 나열한 경우의 수) # 파이썬에서
young-library.tistory.com
2. 리스트 안 튜플
>>> list(product(test, repeat=2))
[('A', 'A'), ('A', 'B'), ('B', 'A'), ('B', 'B')]
product를 이용하면 결과가 튜플로 반환된다.
하지만 사전으로 만들어 검색을 하기 위해서는 튜플 형태가 아닌 문자열 형태로 되어야 한다.
문자열 형태로 만들기 위해서
우선, temp = list(map(list, product(wordlist, repeat=i)))를 하여 product를 하면서 map을 이용해 튜플 -> list로 변환한다.
[('A', 'A'), ('A', 'B'), ('B', 'A'), ('B', 'B')]
-> [['A', 'A'], ['A', 'B'], ['B', 'A'], ['B', 'B']]
다음은 이차원 리스트의 변환된 productlist를 str형태의 일차원 리스트로 변환했다.
for j in range (len(temp)): # 이차원 리스트를 str 일차원 리스트로 변환
productlist.append(''.join(temp[j]))
[['A', 'A'], ['A', 'B'], ['B', 'A'], ['B', 'B']]
-> ['AA', 'AB', 'BA', 'BB']
3. 정렬
정렬하기 전
['A', 'E', 'I', 'O', 'U', 'AA', 'AE', 'AI', 'AO', 'AU', 'EA', 'EE', 'EI', 'EO', 'EU', 'IA', 'IE', 'II', 'IO', 'IU', 'OA', 'OE', 'OI', 'OO', 'OU', 'UA', 'UE', 'UI', 'UO', 'UU', .... , 'UUUUI', 'UUUUO', 'UUUUU']
정렬한 후
['A', 'AA', 'AAA', 'AAAA', 'AAAAA', 'AAAAE', 'AAAAI', 'AAAAO', 'AAAAU', 'AAAE', 'AAAEA', 'AAAEE', 'AAAEI', 'AAAEO', 'AAAEU', 'AAAI', 'AAAIA', 'AAAIE', 'AAAII', .... , 'UUUUI', 'UUUUO', 'UUUUU']
처음에는 정렬이 되어있다고 생각했는데 생각해보니 정렬을 하기 전에는 글자 수 정렬이 먼저 된 후 문자열 정렬이 되어있었다.
하지만 사전은 글자 수를 배제하고 문자열 정렬만 돼야 했다.
따라서 마지막에 sort를 이용해 정렬을 해줘야 한다.
productlist.sort() # 사전 순 정렬
문제 출처
코딩테스트 연습 - 5주차
사전에 알파벳 모음 'A', 'E', 'I', 'O', 'U'만을 사용하여 만들 수 있는, 길이 5 이하의 모든 단어가 수록되어 있습니다. 사전에서 첫 번째 단어는 "A"이고, 그다음은 "AA"이며, 마지막 단어는 "UUUUU"입니
programmers.co.kr
'[Python] Programmers > Level2' 카테고리의 다른 글
[프로그래머스/Level2] 다음 큰 숫자 (0) | 2021.09.08 |
---|---|
[프로그래머스/Level2] 후보키(2019 카카오 블라인드) (0) | 2021.09.02 |
[프로그래머스/Level2] 삼각 달팽이 (0) | 2021.08.25 |
[프로그래머스/Level2] 주식 가격 (0) | 2021.08.24 |
[프로그래머스/Level2] 큰 수 만들기 (0) | 2021.08.20 |
댓글