LeetCode - The World's Leading Online Programming Learning Platform
input: 정수 x
output: 주어진 정수를 뒤집어서 출력 (123 → 321)
뒤집은 정수가 int의 범위를 넘어서는 경우[-2^31, 2^31 -1], 0 리턴
64 bit 정수 값 저장 못한다는 가정
• -231 <= x <= 231 - 1
정수를 문자로 변환하여 뒤집어준 후, Int의 경계에 근접한 경우(10자리수)에만 범위를 벗어나는지 확인하면 된다.
처음엔 뒤집은 숫자를 int로 변화하였을 때, 부호가 바뀌는지(오버플로우)를 통해 int 경계 내부인지 판단하려 했으니 String → int 변환 과정에서 범위 밖일 경우 exception이 발생하여 실패
문자로 변화 후 뒤집기
import java.lang.StringBuilder
class Solution {
val sb = StringBuilder()
val max = Int.MAX_VALUE.toString() // 2147483647
val min = Int.MIN_VALUE.toString().substring(1, 11) // 2147483648
fun reverse(x: Int): Int {
val s = x.toString()
if (x >= 0) { // 양수
for (i in s.indices.reversed()) {
sb.append(s[i])
}
val result = sb.toString()
if (result.length == 10) { // 경계에 근접한 경우
return zeroIfOutOfIntRange(result, max)
} else {
return result.toInt()
}
} else { // 음수
for (i in s.length - 1 downTo 1) { // -부호 전까지만
sb.append(s[i])
}
val result = sb.toString()
if (result.length == 10) { // 경계에 근접한 경우
return zeroIfOutOfIntRange(result, min) * -1
} else {
return result.toInt() * -1
}
}
return 0
}
// 정수의 경계에 벗어나는 확인
fun zeroIfOutOfIntRange(str: String, max: String): Int {
for (i in str.indices) {
if (str[i].toInt() != max[i].toInt()) {
// 경계를 벗어난 경우 0 리턴
if (str[i].toInt() > max[i].toInt()) return 0
return str.toInt()
}
}
return str.toInt()
}
}
시간 복잡도: 문자열 순회 + 경계 확인 = n