링크: https://programmers.co.kr/learn/courses/30/lessons/84512

문제 설명

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

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

제한사항

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

아이디어

이 문제를 보고나서 분명 수학적 관계가 있을거라고는 생각했다.

하지만 그 규칙을 찾는것이 어려웠기 때문에 완전 탐색으로 풀기로 했다.

풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
const alphabet = ['A', 'E', 'I', 'O', 'U']
const wordIndex = [0, 0, 0, 0, 0, 0]
let wordLength = 0
let index = 1
const concat = []

function find(findWord) {
while (wordIndex[0] !== 1) {
if (wordLength === 5) {
while (wordIndex[wordLength] === 4) {
wordIndex[wordLength] = 0
wordLength--
concat.pop()
}
wordIndex[wordLength]++
concat.pop()
concat.push(alphabet[wordIndex[wordLength]])
} else {
concat.push(alphabet[wordIndex[++wordLength]])
}

if (concat.join('') === findWord) {
return index
} else {
index++
}
}
}

function solution(word) {
return find(word)
}

그냥 A, AA, AAA, …, UUUUU 까지 전부 대조해보는 방식이다.

경우의 수가 얼마 없기 때문에 시간 복잡도는 크지 않다.

다른 사람의 풀이를 확인해보니 역시 수식으로 풀 수 있는 방법이 있더라…