LeetCode - The World's Leading Online Programming Learning Platform

Problem

  1. input: 문자열 s
  2. output: 주어진 문자열을 규칙에 맞춰 정수로 변환하여 리턴

Idea

각 스텝에 맞춰 시뮬레이션/구현 풀이

  1. 시작 공백 제거
  2. 문자에서 규칙에 맞춰 숫자인 부분만 추출
  3. 추출한 숫자가 경계 내부인지 확인

Solution

  1. 시뮬레이션/구현

    idea의 스텝에 맞춰 구현

    class Solution {
        fun myAtoi(s: String): Int {
            val str = s.trimStart() // 1. 시작 공백 제거
            if (str.isEmpty()) return 0 // 비어있는 문자열 -> 0
            // 2. 숫자인 부분만 자르기
            var startIdx = 0
            var sign = 1
            var idx = 0
            // 시작 부호 처리
            if (str[0] == '-' || str[0] == '+') {
                sign = if (str[0] == '-') -1 else 1
                idx++
                startIdx++
            }
            while (idx < str.length && str[idx].isDigit()) {
                if (startIdx == idx && str[idx] == '0') startIdx++
                idx++
            }
            // 3. 숫자인 부분 경계에 맞는지 분기처리
            val number = if (startIdx == idx) "0" else str.substring(startIdx, idx)
            return if (idx == 0) { // 숫자 없음
                0
            } else if (idx - startIdx < 10) { // 무조건 경계 안의 수
                number.toInt() * sign
            } else { // 경계 밖일 가능성 O
                if (number.length > 10) return if (sign > 0) 2147483647 else -2147483648 // 무조건 경계 밖인 경우
                val max = if (sign < 0) "2147483648" else "2147483647"
                clampIfOutOfIntRange(number, max, sign) // 경계 밖인지 확인
            }
        }
    		// 주어진 문자가 정수의 범위 밖이면 고정값 반환
        fun clampIfOutOfIntRange(str: String, max: String, sign: Int): Int {
            if (sign <0 && str == "2147483648") return -2147483648 // 최솟값 경계의 값인지 확인(부호 때면 양의 최대값 초과하므로)
            for (i in str.indices) {
                if (str[i].toInt() != max[i].toInt()) {
                    // 경계를 벗어난 경우 고정값 리턴
                    if (str[i].toInt() > max[i].toInt()) return if (max == "2147483647") 2147483647 else -2147483648
                    return str.toInt() * sign
                }
            }
            return str.toInt() * sign
        }
    }
    

    시간 복잡도: 문자열 순회(숫자 추출) + 문자열 순회(경계 확인) = n

    Untitled

Point

  1. 정수의 경계값: Int.MAX_VALUE, Int.MIN_VALUE