Coding Test/프로그래머스

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

hzoooo 2021. 9. 15. 22:16

[문제 설명]

 

코딩테스트 연습 - 5주차_모음사전

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

programmers.co.kr


[나의 답안]

def calculate_diff(char):
    if char == 'A':
        return 0
    elif char == 'E':
        return 1
    elif char == 'I':
        return 2
    elif char == 'O':
        return 3
    elif char == 'U':
        return 4

def solution(word):
    char_diff_list = []
    digit_coefficient = [781, 156, 31, 6, 1]
    for i, char in enumerate(word):
        char_diff_list.append(calculate_diff(char))
    answer = len(word) + sum([char_diff_list[i] * digit_coefficient[i] for i in range(len(char_diff_list))])

    return answer

위 필기와 같이 접근하여, 문제를 해결하였다.


※회고

1. calculate_diff 함수를 "AEIOU".index(char) 단 3단어로 만들 수 있다. (아직 파이써닉하게 짜긴 멀었다..)

 

2. 좀 더 나아가서, 접근2 에서 찾은 규칙들을 확인해보면 4 X 시그마 5^k (k=0, 1, 2, 3) 과 같은 규칙이 있다.

   즉, 자리마다 알파벳 순서가 바뀔수록 시그마 5^k 만큼 바뀐다는 이야기다.

   수학을 좋아하는 나로써 [781, 156, 31, 6, 1]과 같이 규칙을 찾아 미리 정해두었지만,

   등비수열의 합으로 상수 식을 만들 생각을 하지 못해서 아쉬웠다.

필기) 졸업하고 처음 다시 적어본 등비수열의 합.

아래는 등비수열의 합으로 일반화한 식을 통해 답을 구한다. 6줄만에 깔끔하다.

def solution(word):
    answer = 0
    for i, char in enumerate(word):
        coef = ((5 ** (5 - i) - 1) / (5 - 1))
        answer += coef * "AEIOU".index(char) + 1
    return answer

 

3. 다른 사람의 코드인데, 진짜 놀랍도록 파이써닉하다.

   공부해서 파이썬 카테고리에 올려야지.

from itertools import product

solution = lambda word: sorted(["".join(c) for i in range(5) for c in product("AEIOU", repeat=i+1)]).index(word) + 1