문자열 계산하기

Hisop·2022년 11월 7일
0

"3 + 7" 형태로 들어온 문자열을 해석하여 결과를 리턴하는 과제였다.

func solution(_ my_string:String) -> Int {
    var temp = my_string.split(separator:" ").joined()
    temp.append(" ")
    var result = 0
    var tempv = 0
    var n = 1
    for val in temp
    {
        if (nil != val.wholeNumberValue)
        {
            tempv = tempv * 10 + val.wholeNumberValue!
        }
        else
        {
            result = n == 1 ? result + tempv : result - tempv
            tempv = 0
            n = val == "+" ? 1 : 0
        }
    }
    return result
}

나는 숫자 String을 Int로 변환한 뒤 기호를 만났을 때 이전 기호에 따라 더하거나 빼주면 문제가 해결된다고 인지했다.

공백으로 구분되어있기에 일단 split으로 공백을 없앤 후 joined를 이용하여 다시 String의 형태로 만들어주었다.

나는 Character단위로 해석했기에 10을 곱해가며 값을 더해줄 임시 변수 tempv를 만들었고 기호를 만나기 전까지의 값을 임시로 저장해주었다.

기호를 만나면 +-를 저장해놓은 n을 확인하여 result에 여태까지의 값인 tempv를 더하거나 뺀 후 값을 초기화시켰다.
그 후 다음에 기호를 만났을때 활용할 n값을 다시 결정해주었다.

wholeNumberValue

Character의 메서드 중 하나로 정수일경우 그 Int형을 반환하고 정수가 아닐경우 nil을 반환한다. 옵셔널 타입을 리턴하므로 !로 언래핑하여 사용할 수 있다.


대충 정리하면서 보이는것들

  • for문 밖에 삼항연산자를 추가하는것이 temp String에 공백을 append하는것보다 훨씬 직관적으로 해석되지 않았을까. 이렇게 바꿨으면 temp는 let으로 선언해도 괜찮았겠다.
  • 변수 n은 Bool타입으로 선언하는게 훨씬 보기 좋았을듯 C 버릇인거같다
  • 나처럼 split한 String을 다시 합쳐주지 않고Int(Array)! 형태로 바로 변환해서 쓰는 경우가 잦았다.

참고 자료

Character의 속성

profile
42seoul - C, C++ / YagomAcademy - Swift

0개의 댓글