문자열
my_string
이 매개변수로 주어집니다.my_string
안의 모든 자연수들의 합을 return하도록 solution 함수를 완성하세요.제한사항
- 1 ≤
my_string
의 길이 ≤ 1,000my_string
은 소문자, 대문자 그리고 한자리 자연수로만 구성되어 있습니다.입출력 예
my_string result "aAb1B2cC34oOp" 10
import Foundation
func solution(_ my_string:String) -> Int {
var sum = 0
for char in my_string {
if char.isNumber {
sum += char.wholeNumberValue ?? 0
}
}
return sum
}
문자열을 순회하면서 숫자인 경우 char.wholeNumberValue
를 사용해 정수로 변환한 후, 합계를 구하는 방식으로 작성했다.
처음엔 그냥 Int로 씌워주면 되는 줄 알고 내 머릿 속에서 생각할 수 있는 모든 방법을 사용해봤지만 안됐다. 힌트 사용권을 사용했다.
char.wholeNumberValue
을 사용하면 된다고 했다. char.wholeNumberValue
는 Character 타입의 프로퍼티라구 한다. Character가 숫자일 경우 해당 숫자의 정수 값을 반환할 수 있다고 한다. 만약 숫자가 아닌 경우에는 nil을 반환한다고 한다. 그래서 ?? 0
을 붙여서 nil
일 때 대신 0
을 할당하도록 한다.
import Foundation
func solution(_ my_string: String) -> Int {
return my_string.filter { $0.isNumber }.compactMap { $0.wholeNumberValue }.reduce(0, +)
}
이 방식은 filter
로 숫자만 남긴 뒤, compactMap
으로 각 숫자를 정수로 변환하고, reduce
로 합계를 구하는 과정으로 이루어져 있다. 이와 같은 고차함수를 사용하면 코드가 더욱 간결해지고 가독성이 좋아진다. 아직은 처음부터 고차함수가 생각나진 않는다 ㅠㅠ 😭
filter
와 compactMap
을 함께 사용하면 매우 간결하게 처리할 수 있다.char.wholeNumberValue
는 Character
를 정수로 변환하는 유용한 방법이다.