라떼는말이야

[프로그래머스 위클리챌린지] 5주차_모음 사전 본문

알고리즘/코딩 테스트

[프로그래머스 위클리챌린지] 5주차_모음 사전

MangBaam 2021. 8. 30. 11:22
반응형

도움이 되었다면 [mangbaam] 좋아요 부탁드려요!

19번째로 풀이

이번 주는 19번째로 풀이했다. (이미 10시 50분에 풀이를 완료한 사람이 6명이나 있었던...)


문제 설명

사전에 알파벳 모음 'A', 'E', 'I', 'O', 'U'만을 사용하여 만들 수 있는, 길이 5 이하의 모든 단어가 수록되어 있습니다. 사전에서 첫 번째 단어는 "A"이고, 그다음은 "AA"이며, 마지막 단어는 "UUUUU"입니다.

단어 하나 word가 매개변수로 주어질 때, 이 단어가 사전에서 몇 번째 단어인지 return 하도록 solution 함수를 완성해주세요.

제한사항

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

입출력 예

입출력 예

입출력 예 설명

입출력 예 #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번째 단어입니다.


나의 풀이

무식한 방법으로 풀었다. 시간 초과 날 줄 알았더니 통과가 되어버린... 아마도 더 효율적인 풀이가 있을 것이다.

나는 모든 경우의 수를 리스트에 때려 넣고 정렬을 해서 사전을 만들었다.

from itertools import product
def solution(word):
    answer = 0
    dictionary = []
    for i in range(1, 6):
        dictionary.extend(list(map(''.join, product(['A','E','I','O','U'], repeat=i))))
    dictionary.sort()
    return dictionary.index(word)+1

이때 product라는 라이브러리를 사용했는데 product는 product([뽑아낼 데이터], repeat=뽑는 개수) 로 사용할 수 있다.

위의 경우엔 'A','E','I','O','U' 를 가지고 i개를 뽑아내겠다는 건데 i는 1~5까지 이므로 모든 경우의 수를 추출할 수 있다.

product의 실행결과

이런식으로 나오게 되는데 이것을 하나의 문자열로 만들어주기 위해 map과 ''.join을 사용했다.

map과 ''join을 사용하여 문자열로 매칭

그럼 각각의 튜플 결과에 ''.join() 함수가 적용되어 문자열로 뽑아낼 수 있게 된다.

이것을 리스트에 extend를 사용하여 확장했다.

append와의 차이점은 append는 리스트 안에 리스트를 넣어버리고, extend는 리스트에 다른 리스트의 모든 요소를 넣는 것이다.

정렬된 dictionary

AEIOU가 이미 알파벳 순이기 때문에 이것을 정렬하면 우리가 원하는 사전의 순서대로 정렬된다.

여기서 word로 받은 문자열을 index로 찾아서 + 1 하면 답이 된다. (인덱스는 0부터 시작하기 때문)

테스트 결과

 

반응형
Comments