LeetCode - The World's Leading Online Programming Learning Platform

Problem

  1. input: 정수 x

  2. output: 주어진 정수를 뒤집어서 출력 (123 → 321)

  3. 뒤집은 정수가 int의 범위를 넘어서는 경우[-2^31, 2^31 -1], 0 리턴

  4. 64 bit 정수 값 저장 못한다는 가정

    -231 <= x <= 231 - 1

Idea

정수를 문자로 변환하여 뒤집어준 후, Int의 경계에 근접한 경우(10자리수)에만 범위를 벗어나는지 확인하면 된다.

처음엔 뒤집은 숫자를 int로 변화하였을 때, 부호가 바뀌는지(오버플로우)를 통해 int 경계 내부인지 판단하려 했으니 String → int 변환 과정에서 범위 밖일 경우 exception이 발생하여 실패

Solution

  1. 문자로 변화 후 뒤집기

    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

    Untitled

Point