LeetCode - The World's Leading Online Programming Learning Platform
0 <= s.length <= 200
s
consists of English letters (lower-case and upper-case), digits (0-9
), ' '
, '+'
, '-'
, and '.'
.각 스텝에 맞춰 시뮬레이션/구현 풀이
시뮬레이션/구현
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
Int.MAX_VALUE
, Int.MIN_VALUE