문제에서 나온 그대로 구현하기만 하면 됩니다. 예시에 나온 변수명 w와 c를 그대로 사용해서 구현해보았습니다. i는 c의 index입니다.
주의할 점은 두 가지입니다. 먼저 마지막에 반복문을 탈출하고 나서 dict[w]를 ans에 추가하는 것을 잊지 말도록 합시다! 그리고 처음에 사전을 초기화할 때 아스키코드를 활용하면 편하게 할 수 있습니다.
func solution(_ msg:String) -> [Int] {
// A ~ Z까지 사전 초기화 하기
var dict = [String:Int]()
let baseAscii = Int(Character("A").asciiValue!)
for i in 0..<26 {
let s = String(UnicodeScalar(baseAscii + i)!)
dict[s] = i + 1
}
// index로 탐색할 수 있도록 Array로 바꾸기
let msg = msg.map { String($0) }
// i는 c의 index
var i = 1
// w에 첫 글자 세팅
var w = msg[0]
// 정답을 저장할 배열
var ans = [Int]()
while i < msg.count {
let c = msg[i]
let wc = w + c
// wc가 사전에 없는 경우
if dict[wc] == nil {
ans.append(dict[w]!) // 출력하고
dict[wc] = dict.count + 1 // 사전에 wc를 추가한다.
w = c // w는 다음 글자인 c
i += 1 // 다음 c의 index는 뒤로 하나 이동
continue
}
// 사전에 있는 경우 w에 c를 더하고 다시 탐색
w = wc
i += 1
}
// 다음 c가 없을 때 마지막에 남은 w 출력
ans.append(dict[w]!)
return ans
}