문제 링크 (opens new window)

# 문제 설명

  1. atoi 커스텀 함수를 구현하는 문제
  2. 앞의 공백 무시, 인덱스 오버플로우 체크
  3. 자릿수 계산하며 result값 계산, 32비트 최댓값 오버플로우 발생하는 경우 Int32 최소 혹은 최댓값으로 리턴
  4. 32비트 이상 값에 대해 대소 비교를 진행해야 하므로 Int64 타입으로 result에 저장
class Solution {
    func myAtoi(_ s: String) -> Int {
        var result: Int64 = 0
        var sign = 1
        var i = 0
        var s = Array(s)

        if s.isEmpty { return 0 }

        while(s[i] == " ") {
            i += 1
            if i >= s.count { return 0 }
        }

        if s[i] == "-" || s[i] == "+" {
            sign = s[i] == "-" ? -1 : 1
            i += 1
            if i >= s.count { return 0 }
        }

        while(i < s.count && s[i].wholeNumberValue != nil) {
            result = 10 * result + Int64(s[i].wholeNumberValue!)
            if result * Int64(sign) > Int32.max {
                return Int(Int32.max)
            } else if result * Int64(sign) < Int32.min {
                return Int(Int32.min)
            }
            i += 1
        }
        return Int(result) * sign
    }
}

# 쉬운 풀이

  1. NSStringintegerValue속성으로 추출하면 문제에서 요구하는 atoi 알고리즘과 동일하게 숫자 변환 가능
class Solution {
    func myAtoi(_ s: String) -> Int {
        guard !s.contains("+ ") else { return 0 }
        let val = (s as NSString).integerValue
        return val >= Int32.max ? Int(Int32.max) : max(Int(Int32.min), val)
    }
}