문제
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
- 문제에서 준 범위로 x를 먼저 걸러준다.
- x를 문자열로 변환한 값을 별도 변수에 대입한다.
- x가 음수면 ’-‘가 붙어있을 것이기 때문에 양수인 경우, 음수인 경우 나눠준다.
- 양수라면 변환한 문자열을 그대로 뒤집는다.
- 음수라면 ’-‘를 제거한 문자열을 뒤집고 그 결과에 다시 ’-‘를 더해준다.
- 각 조건에서 나온 결과값을 정수로 변환한다.
- 결과값 또한 문제에서 제시한 값 범위 내에 있는지 판별해 리턴값을 지정해준다.
중복된 부분이 없고 pop을 쓰지 않았기 때문에 코드는 훨씬 간편해졌지만 사실 공간복잡도만 상위 60% 수준으로 약~간 개선됐다. 짧은 코드가 좋은 코드인지 아니면 시간/공간복잡도가 무조건 낮은 게 좋은 코드인지 모르겠다.