All Articles

LeetCode - 7번 Reverse Integer

LeetCode 7번 Reverse Integer

문제

Given a 32-bit signed integer, reverse digits of an integer.

Example 1

Input: 123
Output: 321

Example 2

Input: -123
Output: -321

Example 3

Input: 120
Output: 21

Note:

Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−231, 231 − 1]. For the purpose of this problem, assume that your function returns 0 when the reversed integer overflows.

내 풀이

class Solution:
  def reverse(self, x):
    if x >= 2**31-1 or x <= -2**31:
      return 0
    else:
      string_x = list(str(x))
      if x < 0:
        string_x = list(str(x))[1:]
        reverse_sting = []
        for i in range(len(string_x)):
          reverse_sting.append(string_x.pop())
        result = "".join(reverse_sting)
        result = int(result)
        if result >= 2**31-1 or result <= -2**31:
          return 0
        return result*-1
        reverse_sting = []
        for i in range(len(string_x)):
          reverse_sting.append(string_x.pop())
        result = "".join(reverse_sting)
        result = int(result)
        if result >= 2**31-1 or result <= -2**31:
          return 0
        return result

이게 뭣이냐… 이게 코드냐… 시간복잡도는 O(n)으로 나머지 76%보다 나은 수준이라 해서 나쁘지 않은데 왜인지 아무튼 나빠보이는 코드다. 공간복잡도는 제법 후진 편. 나보다 메모리를 많이 잡아먹은 사람이 내 뒤로 36%뿐이다.

30분 고심하다 못 풀겠어서 솔루션을 살짝 봤고, pop으로 풀면 된다고 해서 그것만 생각하고 풀었다. 리턴 값 범위도 x 범위와 마찬가지로 잡아줘야 했는데 그걸 빼먹었다.

근데 이렇게 하고 생각해보니 코드카타할 때 문자열 뒤집는 거 그게 기억났다. 그때 이리저리 잘 써먹어놓고 그걸 어떻게 까먹을 수 있지. 일해라 머리야 장식이 아니잖아

Refactoring

class Solution:
  def reverse(self, x):
    if x >= 2**31-1 or x <= -2**31:
      return 0
    string_x = str(x)
    if x >= 0:
      result = string_x[::-1]
    else:
      string_x = string_x[1:]
      result = string_x[::-1]
      result = '-' + result
    result = int(result)
    if result >= 2**31-1 or result <= -2**31:
      return 0
    return result
  1. 문제에서 준 범위로 x를 먼저 걸러준다.
  2. x를 문자열로 변환한 값을 별도 변수에 대입한다.
  3. x가 음수면 ’-‘가 붙어있을 것이기 때문에 양수인 경우, 음수인 경우 나눠준다.
  4. 양수라면 변환한 문자열을 그대로 뒤집는다.
  5. 음수라면 ’-‘를 제거한 문자열을 뒤집고 그 결과에 다시 ’-‘를 더해준다.
  6. 각 조건에서 나온 결과값을 정수로 변환한다.
  7. 결과값 또한 문제에서 제시한 값 범위 내에 있는지 판별해 리턴값을 지정해준다.

중복된 부분이 없고 pop을 쓰지 않았기 때문에 코드는 훨씬 간편해졌지만 사실 공간복잡도만 상위 60% 수준으로 약~간 개선됐다. 짧은 코드가 좋은 코드인지 아니면 시간/공간복잡도가 무조건 낮은 게 좋은 코드인지 모르겠다.