CodingTest/완전 탐색(구현)

프로그래머스 (Level 2) - 모음 사전

seongduck 2022. 8. 9. 19:05

1. 문제 설명

  • 사전에 알파벳 모음  'A', 'E', 'I', 'O', 'U'  만을 사용하여 만들 수 있는 길이 5 이하의 모든 단어가 수록되어 있다.
  • 사전에서 첫 번째 단어는 "A"이고 그다음은 "AA"이며, 마지막 단어는 "UUUUU"이다.
  • 단어 하나 word가 매개변수로 주어질 때, 이 단어가 사전에서 몇 번째 단어인지 return 하라

2. 제한사항

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

3. 입출력 예

word result
"AAAAE" 6
"AAAE" 10
"I" 1563
"EIO" 1189
  •  
  • 사전에서 첫 번째 단어는 A -> AA -> ... -> AAAAA -> AAAAE 이므로 6번째 단어이다.
  • "AAAE"는 "A", "AA", "AAA", "AAAA", "AAAAA", "AAAAE", "AAAAI", "AAAAO", "AAAAU"의 다음인 10번째 단어이다.

4. 풀이 접근

  1. 사전에 모든 단어들을 수록해야하므로 중복순열을 이용해서 모든 단어를 사전에 수록한다.
  2. 사전을 내림차순으로 정렬한다.
  3. 그리고 하나의 단어로 만들어준다.
  4. 비교한다.

5. 코드

from itertools import product
def solution(word):
    dic = []
    answer = 0

    for i in range(1,6): #5가지 단어를 조합하여 중복포함 단어 생성
        for j in product(['A','E','I','O','U'],repeat = i):
            dic.append(j)

    dic = sorted([str(("").join(key)) for key in dic]) #단어순으로 정렬 후 사전 만들기
           
    return dic.index(word) + 1
  • 순열을 이용하여 모든 단어를 생성하고 정렬해준다.

6. 알아둘만한 문법

dic.index(word)
  • dic이란 리스트안에 word라는게 몇 번째 index에 있는지 출력
  • 원하는 단어가 몇 번째 인덱스에 있는지 확인

 

#중복 순열
from itertools import product

for i in product([1,2,3],'ab'):
    print(i, end=" ")
(1, 'a') (1, 'b') (2, 'a') (2, 'b') (3, 'a') (3, 'b')

 

for i in product(range(3), range(3), range(3)):
    print(i, end=" ")
(0, 0, 0) (0, 0, 1) (0, 0, 2) (0, 1, 0) (0, 1, 1) (0, 1, 2) (0, 2, 0) (0, 2, 1) (0, 2, 2) (1, 0, 0) (1, 0, 1) (1, 0, 2) (1, 1, 0) (1, 1, 1) (1, 1, 2) (1, 2, 0) (1, 2, 1) (1, 2, 2) (2, 0, 0) (2, 0, 1) (2, 0, 2) (2, 1, 0) (2, 1, 1) (2, 1, 2) (2, 2, 0) (2, 2, 1) (2, 2, 2)

 

for i in product([1,2,3], repeat=2):
    print(i, end=" ")
(1, 1) (1, 2) (1, 3) (2, 1) (2, 2) (2, 3) (3, 1) (3, 2) (3, 3)

 

for i in product([1,2,3], repeat=3):
    print(i, end=" ")
(1, 1, 1) (1, 1, 2) (1, 1, 3) (1, 2, 1) (1, 2, 2) (1, 2, 3) (1, 3, 1) (1, 3, 2) (1, 3, 3) (2, 1, 1) (2, 1, 2) (2, 1, 3) (2, 2, 1) (2, 2, 2) (2, 2, 3) (2, 3, 1) (2, 3, 2) (2, 3, 3) (3, 1, 1) (3, 1, 2) (3, 1, 3) (3, 2, 1) (3, 2, 2) (3, 2, 3) (3, 3, 1) (3, 3, 2) (3, 3, 3)