코딩 테스트 연습 - 모음사전 [위클리 챌린지 5주차]
확률 문제를 오랜만에 보니 생각보다 쉽지 않았던 문제였습니다.
풀이
각 자리별로 앞서는 단어들의 개수를 센다.
먼저 각 자리별로 가능한 단어들의 개수를 알아야 합니다.
예를 들어 'A'로 시작하는 단어들의 개수는 \( 5^1+5^2+5^3+5^4 \)로 781개가 되고 다른 모음들도 마찬가지입니다.
즉 모음에 상관없이 단어를 왼쪽 정렬한다고 생각한 뒤 단어의 자리가 어느 위치인지를 먼저 알아야 하는 것이죠.
\( \Rightarrow \) 자리 순서대로 [781, 156, 31, 6, 1] 개의 가능한 단어들이 있을 것입니다.
자리별 단어들의 개수를 계산한 후에 word보다 앞서는 단어들의 개수를 세어주면 문제가 해결됩니다.
"EIO"의 경우 가장 첫 번째 자리 "E"보다 앞서는 알파벳이 "A", 두 번째 자리 "I"보다 앞서는 "A", "E", 세 번째 자리 O보다 앞서는 "A", "E", "I"가 있고 이를 수식화해서 계산하면 아래와 같습니다.
- (현재 위치의 단어보다 앞서는 단어의 개수) \( \times \) 현재위치의 단어들의 개수 \( + 1\)
그럼 "EIO"의 경우 \( (1\times781+1) + (2\times156+1) + (3\times31+1) = 1189 \) 번째 순서라는 것을 계산할 수 있습니다.
Code
def solution(word):
adict, nums = {'A': 0, 'E': 1, 'I': 2, 'O': 3, 'U': 4}, []
answer, prev = 0, 0
for i in range(5):
nums.append(prev + 5 ** i)
prev += 5 ** i
for idx, ele in enumerate(word):
answer += adict[ele] * nums[4 - idx] + 1
return answer
문제 설명
사전에 알파벳 모음 'A', 'E', 'I', 'O', 'U'만을 사용하여 만들 수 있는, 길이 5 이하의 모든 단어가 수록되어 있습니다. 사전에서 첫 번째 단어는 "A"이고, 그다음은 "AA"이며, 마지막 단어는 "UUUUU"입니다.
단어 하나 word가 매개변수로 주어질 때, 이 단어가 사전에서 몇 번째 단어인지 return 하도록 solution 함수를 완성해주세요.
제한사항
- word의 길이는 1 이상 5 이하입니다.
- word는 알파벳 대문자 'A', 'E', 'I', 'O', 'U'로만 이루어져 있습니다.
입출력 예
word | result |
"AAAAE" | 6 |
"AAAE" | 10 |
"I" | 1563 |
"EIO" | 1189 |
입출력 예 #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번째 단어입니다.
'Algorithm' 카테고리의 다른 글
[프로그래머스] 코딩테스트 연습 - 빛의 경로 사이클 (Python) (0) | 2021.09.19 |
---|---|
[프로그래머스] 코딩테스트 연습 - N으로 표현 (Python) (0) | 2021.09.08 |
[프로그래머스] 코딩테스트 연습 - 베스트앨범 (Python) (0) | 2021.08.20 |
[프로그래머스] 위클리 챌린지 3주차 - 퍼즐 조각 채우기 (Python) (4) | 2021.08.18 |
[프로그래머스] 코딩테스트 연습 - 가장 큰 수 (Python) (0) | 2021.08.10 |