문제
word를 찾아 인덱스를 반환한다.func solution(_ word: String) -> Int {
let vowels: [Character] = ["A", "E", "I", "O", "U"]
var dictionary: [String] = [] // 모든 단어를 저장할 배열
// 재귀 함수로 모든 단어 생성
func generateWords(currentWord: String) {
// 단어의 길이가 1 이상 5 이하일 경우 사전에 추가
if !currentWord.isEmpty {
dictionary.append(currentWord)
}
// 단어의 길이가 5가 되면 더 이상 확장하지 않고 리턴
if currentWord.count == 5 {
return
}
// 각 모음을 현재 단어 뒤에 붙여 새로운 단어 생성
for vowel in vowels {
generateWords(currentWord: currentWord + String(vowel))
}
}
// 빈 문자열부터 단어 생성 시작
generateWords(currentWord: "")
dictionary.sort()
// 주어진 단어의 인덱스를 찾아 반환 (인덱스는 0부터 시작하므로 +1)
if let index = dictionary.firstIndex(of: word) {
return index + 1
}
return -1
}

각 자릿수에서 모음이 변경될 때마다 단어의 총 개수가 어떻게 증가하는지 파악한다.
예를 들어 A 다음 E로 바뀌려면 'A'로 시작하는 모든 길이의 단어를 건너뛰어야 한다.
규칙 찾기
모음은 "A", "E", "I", "O", "U" 순서로 인덱스 0, 1, 2, 3, 4를 가진다.
한 자리수만 있을 때:
A는 첫 번째E는 A로 시작하는 모든 단어 + 1I는 A로 시작하는 모든 단어 + E로 시작하는 모든 단어 + 1각 자리별로 '한 칸' 이동했을 때 건너뛰는 단어의 수
각 자릿수에서 모음 하나가 바뀌면 건너뛰는 단어의 수는 1 + 5 + 25 + 125 + 625가 된다.
즉, 이 규칙을 거꾸로 생각하면 아래와 같다.
이를 통해 '가중치' 배열을 미리 계산할 수 있다.
weights = [781, 156, 31, 6, 1]
func solution(_ word: String) -> Int {
let vowels: [Character] = ["A", "E", "I", "O", "U"]
let weights = [781, 156, 31, 6, 1]
var result = 0
for (index, char) in word.enumerated() {
if let charIndex = vowels.firstIndex(of: char) {
result += charIndex * weights[index]
}
}
result += word.count
return result
}
