[문제 설명]
코딩테스트 연습 - 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
'Coding Test > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 위클리 챌린지 7주차(python) (0) | 2021.09.18 |
---|---|
[프로그래머스] 위클리 챌린지 6주차 : 복서 정렬하기(python) (0) | 2021.09.16 |
[프로그래머스] 위클리 챌린지 4주차 : 직업군 추천하기(python) (0) | 2021.09.14 |
[프로그래머스] 위클리 챌린지 2주차 : 상호평가(python) (0) | 2021.09.13 |
[프로그래머스] 위클리 챌린지 1주차 : 부족한 금액 계산하기(python) (0) | 2021.09.13 |