====== 모음 사전 ======
===== 풀이 =====
* 무식한 방법은 모든 단어를 다 만들어 놓고서 그 중에서 word의 위치를 찾는 것이다. 단어의 갯수는 5^5 개밖에 안되므로, 단어를 전부 생성하고, word 를 찾는것 모두 O(5*5^5)으로 처리된다.
* 제대로 된 풀이는, 길이 n이하의 단어의 갯수, count[n]을 수식으로 계산해두는 것이다. 그 뒤, word의 첫글자가 'I'라면, 'A'또는 'E'로 시작하는 단어들은 모두 word보다 앞에 있다는 것을 알수 있다. 'A' 또는 'E'로 시작하는 단어의 갯수는 2 * count[4]이다. 마찬가지로 word의 두번째 글자가 'E'라면, 'IA'로 시작하는 단어들은 모두 word보다 앞에 있다. 이러한 단어의 갯수는 count[3]이다. 이런식으로 word보다 앞에 올수 있는 모든 단어의 갯수를 O(|word|)에 계산할수 있다.
* count[n]은 5^0 + 5^1 + ... + 5^n 이다. [[#코드]]에서는 이 식대로 계산해서 코드를 만들었지만, 등비수열의 합 공식인 (5^n - 1)/(5-1)을 적용해서 쓰면 아래처럼 한줄에 코딩하는 것도 가능하다
*
def solution(word):
return sum(1 + 'AEIOU'.index(ch) * (5**(5 - i) - 1) // 4 for i, ch in enumerate(word))
===== 코드 =====
==== 코드 1 - 모든 단어를 만들어서 위치를 찾기 ====
"""Solution code for "Programmers 84512. 모음 사전".
- Problem link: https://programmers.co.kr/learn/courses/30/lessons/84512
- Solution link: http://www.teferi.net/ps/problems/programmers/84512
"""
import bisect
import itertools
def solution(word):
dic = []
for i in range(1, 6):
dic.extend(itertools.product('AEIOU', repeat=i))
return bisect.bisect(sorted(dic), tuple(word))
==== 코드 2 - 수식으로 계산 ====
"""Solution code for "Programmers 84512. 모음 사전".
- Problem link: https://programmers.co.kr/learn/courses/30/lessons/84512
- Solution link: http://www.teferi.net/ps/problems/programmers/84512
"""
def solution(word):
v = 0
count = [v := v + 5**i for i in range(5)]
pos = sum(1 + 'AEIOU'.index(ch) * c for ch, c in zip(word, reversed(count)))
return pos
{{tag>프로그래머스 ps:problems:programmers:Level_2}}