[TIL][프로그래머스/Swift] 숨어있는 숫자의 덧셈 (1)

Eden·2024년 11월 27일
0

TIL

목록 보기
53/92
post-thumbnail

문제 설명

문자열 my_string이 매개변수로 주어집니다. my_string 안의 모든 자연수들의 합을 return하도록 solution 함수를 완성하세요.

제한사항

  • 1 ≤ my_string의 길이 ≤ 1,000
  • my_string은 소문자, 대문자 그리고 한자리 자연수로만 구성되어 있습니다.

입출력 예

my_stringresult
"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로 합계를 구하는 과정으로 이루어져 있다. 이와 같은 고차함수를 사용하면 코드가 더욱 간결해지고 가독성이 좋아진다. 아직은 처음부터 고차함수가 생각나진 않는다 ㅠㅠ 😭

배운 점

  • 문자열 내에서 숫자만 추출할 때 filtercompactMap을 함께 사용하면 매우 간결하게 처리할 수 있다.
  • char.wholeNumberValueCharacter를 정수로 변환하는 유용한 방법이다.
  • 고차함수를 활용하면 코드의 길이를 줄이고 가독성을 높일 수 있다.
profile
Frontend🌐 and iOS

0개의 댓글