1. 문제 설명
옹알이 (2)
2. 문제 분석
- 이넘을 통해 말할 수 있는 단어 케이스를 지정, 연산 프로퍼티를 통해 각 단어로 생성되는 문자열 배열을 리턴
- 이전 시점에 언급한 단어를
currentWord
로 가지면서 주어진 단어를 모두 말할 때까지(즉 주어진 단어가 사라질 때까지) 반복. 스위프트에서 문자열 자체 서브스크립트가 다루기 불편한 까닭에 문자열의 배열로 변환해서 확인하고 있다.
- 주어진 단어의 문자열 개수가 비교하려는 단어의 개수 이상이고, 매칭이 되고, 이전에 말한 단어가 아닐 때에만 비로소 발음이 가능하다. 주어진 문자를 전체 문자열 배열에서 제거하고, 이전에 발음한 단어를 체크해주자.
3. 나의 풀이
import Foundation
func solution(_ babbling:[String]) -> Int {
var answer = 0
for babble in babbling {
if isSpeakable(word: babble) {
answer += 1
}
}
return answer
}
enum Words: String, CaseIterable {
case aya
case ye
case woo
case ma
var arrayString: [String] {
return rawValue.map({String($0)})
}
}
func isSpeakable(word: String) -> Bool {
var word = word.map({String($0)})
var currentWord: Words?
while !word.isEmpty {
guard let letter = word.first else { break }
switch letter {
case "a":
if word.count >= 3 && word[0..<3].map({$0}) == Words.aya.arrayString && currentWord != .aya {
for _ in 0..<3 {
word.removeFirst()
}
currentWord = .aya
} else {
return false
}
case "y":
if word.count >= 2 && word[0..<2].map({$0}) == Words.ye.arrayString && currentWord != .ye {
for _ in 0..<2 {
word.removeFirst()
}
currentWord = .ye
} else {
return false
}
case "w":
if word.count >= 3 && word[0..<3].map({$0}) == Words.woo.arrayString && currentWord != .woo {
for _ in 0..<3 {
word.removeFirst()
}
currentWord = .woo
} else {
return false
}
case "m":
if word.count >= 2 && word[0..<2].map({$0}) == Words.ma.arrayString && currentWord != .ma {
for _ in 0..<2 {
word.removeFirst()
}
currentWord = .ma
} else {
return false
}
default: return false
}
}
return true
}