본문 바로가기
[Python] Programmers/Level2

[프로그래머스/Level2] 위클리 챌린지 5주차

by 파크영 2021. 8. 30.

문제 설명

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

 

댓글