본문 바로가기

hacking or software engineering skills/leetcode

[leetcode] reverse_integer (python3)

728x90

String → list → reverse 이용해서 풀기

첫번째 풀이, 28ms

python
class Solution:
    def __init__(self):
        self.min = -2**31
        self.max = 2**31
    def reverse(self, x:int) -> int:
        reverse_list = list(str(x))
        reverse_list.reverse()
        if x < 0:
             reverse_list = [reverse_list.pop()] + reverse_list
        reverse_str = ''.join(reverse_list)
        if int(reverse_str) < self.min or int(reverse_str) > self.max:
            return 0
        else:
            return int(reverse_str)

나눈 몫/나머지 이용해서 풀기
# 1234
# 1234 % 10 -> 4 (10으로 나눈 나머지)
# 1234 / 10 -> 123 (10으로 나눈 몫)
# 123 % 10 -> 3 (10으로 나눈 몫을 10으로 나눈 나머지)
# 123 / 10 -> 12 (10으로 나눈 몫을 10으로 나눈 몫)
# 12 % 10 -> 2 (몫의 몫을 10으로 나눈 나머지)
# 12 / 10 -> 1 (몫의 몫을 10으로 나눈 목)
# 1 % 10 -> 1 (몫의 몫의 몫을 10으로 나눈 나머지)
# 1 / 10 -> 0 (자릿수가 없음)

  • 순식가엔 코드를 작성했는데, 계속 에러가 났다. 이유를 도무지 못 찾겠어서 디버그를 했다. 이유는 / 문제. /는 float 타입을 반환한다. 내가 원하는 몫을 구하는 operator는 ‘/’가 아니라 ‘//’이다.!!

1번 풀이 (32mb/sec)

python
class Solution:
    def __init__(self):
        self.min = -2**31
        self.max = 2**31 - 1
    def reverse(self, x: int) -> int:
        answer = 0        
        minus = x < 0
        quote = abs(x)
        reverse = []
        while quote:
            remain = quote % 10            
            quote = quote // 10
            reverse.append(remain)
        n = len(reverse)
        for i,num in enumerate(reverse):
            pow_idx = n - i - 1
            if minus and answer + num * 10 ** pow_idx > abs(self.min):
                return 0
            elif not minus and answer + num * 10 **pow_idx > self.max:
                return 0
            answer += num * 10 ** pow_idx
        return answer if not minus else -answer

2번 풀이 (36mb/sec)

python
class Solution:
    def __init__(self):
        self.min = -2**31
        self.max = 2**31 - 1
    def reverse(self, x: int) -> int:
        answer = 0        
        minus = x < 0
        quote = abs(x)
        n,i = 0,1
        while quote:
            quote //= 10
            n+=1
        quote = abs(x)    
        while quote:
            remain = quote % 10            
            quote = quote // 10
            if minus:
                if answer +  remain * 10 ** (n-i) > abs(self.min):
                    return 0
            else:
                if answer +  remain * 10 ** (n-i) > self.max:
                    return 0
            answer += remain *10**(n-i)
            i+=1
        return answer if not minus else -answer

4번 풀이 (32mb/sec) (1번+3번 짬뽕)

python
class Solution:
    def __init__(self):
        self.min = -2**31
        self.max = 2**31 - 1
    def reverse(self, x: int) -> int:
        if x == 0:
            return 0   # exception becaure if x==0 -> reverse = "", int("") error. 
        answer = 0        
        minus = x < 0
        quote = abs(x)
        reverse = ""
        while quote:
            remain = quote % 10            
            quote = quote // 10
            reverse += str(remain)
        reverse = "-" + reverse if minus else reverse
        if int(reverse) < self.min or int(reverse) > self.max:
            return 0
        return int(reverse)

솔루션 풀이 (36mb/sec)

class Solution:
    def __init__(self):
        self.min = -2**31
        self.max = 2**31 - 1
    def reverse(self, x: int) -> int:
        answer = 0        
        minus = x < 0
        quote = abs(x)
        reverse = 0
        while quote:
            remain = quote % 10            
            quote = quote // 10
            if not minus and reverse > self.max//10 or ( reverse==self.max//10 and remain > 7):
                return 0
            elif minus and reverse > abs(self.min)//10 or ( reverse==abs(self.min)//10 and remain > 8):
                return 0
            reverse = reverse * 10 + remain
        return reverse if not minus else -reverse
  • reverse = reverse * 10 + remain (매 루프마다 이런식으로 반복하면 된다. 이게 생각이 안났다)
  • reverse를 매 루프마다 업데이트 해줄때, 업데이트 최댓값, 최소값을 직전에 10으로 나눠준 수와 비교한다.

파이썬 버전 솔루션은 없어서 새롭게 구성 (24mb/sec)

class Solution:
    def __init__(self):
        self.min = -2**31
        self.max = 2**31 - 1
    def reverse(self, x: int) -> int:
        answer = 0        
        minus = x < 0
        quote = abs(x)
        reverse = 0
        while quote:
            remain = quote % 10            
            quote = quote // 10
            if minus and reverse*10 +remain > abs(self.min):
                return 0
            if not minus and reverse*10 +remain >self.max:
                return 0
            reverse = reverse * 10 + remain
        return reverse if not minus else -reverse

Runtime: 24 ms, faster than 93.99% of Python3 online submissions for Reverse Integer.
Memory Usage: 12.9 MB, less than 100.00% of Python3 online submissions for Reverse Integer.
Runtime: 24 ms, faster than 93.99% of Python3 online submissions for Reverse Integer.
Memory Usage: 12.9 MB, less than 100.00% of Python3 online submissions for Reverse Integer.

python에선 음수를 나누면 몫과 나머지가 양수가 나온다. 이때문에 C++과 좀 다른듯