리트코드 코딩 테스트 준비
https://leetcode.com/problems/reverse-integer/
문제에 대한 자세한 설명은 다음 사이트에서 확인 할 수 있다.
Given a signed 32-bit integer x, return x with its digits reversed. If reversing x causes the value to go outside the signed 32-bit integer range [-231, 231 - 1], then return 0.
Assume the environment does not allow you to store 64-bit integers (signed or unsigned).
언뜻 보면 쉬워보이지만 문제에 함정이 있다.
1. x의 constraint에서 벗어날때는 return 0
2. 120을 뒤집을때는 021이 아닌 21을 출력
3. -부호도 신경쓰면서 뒤집어야 한다
class Solution:
def reverse(self, x: int) -> int:
arr = []
#음수라면 - 부호
if x < 0 :
x = -x
arr.append('-')
elif x == 0 :
return 0
#divmod를 이용하여 몫과 나머지 계산
while x > 0:
x, res = divmod(x, 10)
arr.append(str(res))
answer = int("".join(arr))
# 제약조건
if answer < -pow(2,31) or pow(2,31) - 1 < answer :
return 0
else :
return answer
class Solution:
def reverse(self, x: int) -> int:
sentinel = '2147483648' if x < 0 else '2147483647'
sign = -1 if x < 0 else 1
s = str(x)[::-1].rstrip('-')
no_overflow = s.rjust(len(sentinel), '0') < sentinel
return int(s) * sign * no_overflow
rjust와 rstrip함수를 이용하여 훨씬 간단하게 표현하였다. time complexity가 미세하게 좋아졌다.
rjust함수
strip([chars]) : 인자로 전달된 문자를 String의 왼쪽과 오른쪽에서 제거합니다.
lstrip([chars]) : 인자로 전달된 문자를 String의 왼쪽에서 제거합니다.
rstrip([chars]) : 인자로 전달된 문자를 String의 오른쪽에서 제거합니다.