"1S2D3T", "1D2S#10S", "1D2S0T", "1S2T3S", "1D#2S3S", "1T2D3D#", "1D2S3T*" 와 같은 문자열만 나누면 쉽게 풀수 있는 문제입니다. split함수에서 분기처리를 잘 해주면 원하는 문자열을 얻을 수 있습니다.
func solution(_ dartResult: String) -> Int {
let num = dartResult.split { $0.isLetter || $0 == "#" || $0 == "*" }.map { Int($0)!}
let letter = dartResult.split { $0.isNumber }
var values = [Int]()
for (i,(v, l)) in zip(num, letter).enumerated() {
var value = 0
let letter = l.first!
let special = l.last!
if letter == "S" {
value = v
} else if letter == "D" {
value = v * v
} else if letter == "T" {
value = v * v * v
}
if special == "*" {
if i > 0 {
values[i-1] *= 2
}
value *= 2
} else if special == "#" {
value *= -1
}
values.append(value)
}
return values.reduce(0, +)
}