Dividend, Divisor 두 Integer 값을 나누면 되는 간단한 문제이다. 하지만, multiply, divide, percent operation을 사용하면 안되는 제약 조건이 있다. 결과 값으로는 나눈 값의 몫을 출력한다.
Input: dividend = 10, divisor = 3
Output: 3
Explanation: 10/3 = truncate(3.33333..) = 3.
Input: dividend = 7, divisor = -3
Output: -2
Explanation: 7/-3 = truncate(-2.33333..) = -2.
Integer범위, divisor != 0 등의 기본적인 조건과, 내 로직이 성립하기 위한 조건들을 코드 앞부분에 처리했다.
Dividend = Divisor * 몫 + 나머지
기본적인 나눗셈은 위와 같이 표현이 가능한데, 곱셈 대신 Divisor의 제곱 수를 이용하여 뺄셈을 해주는 방식으로 표현이 가능하다. 268/3 을 예시로 들어보자.
위 예시와 같이 나누는 수의 거듭제곱 값을 빼주는 식의 접근이 가능하다.
Dividend 값에 가장 근접한 Divisor의 거듭제곱 수를 구한다.
Dividend 값이 Divisor값보다 작아질 때까지(나머지만 남을 때 까지) Dividend에서 Divisor의 거듭제곱 수를 빼주며 거듭제곱 수를 줄여주는 작업을 반복한다.
class Solution:
def divide(self, dividend: int, divisor: int) -> int:
sign = True
result = 0
limit = pow(2,31) - 1
if(-(limit + 1) > dividend > limit):
return -1
if(divisor == 0 or -(limit + 1) > divisor > limit):
return -1
if(divisor == 1):
return dividend
if(divisor == -1):
if(dividend > limit + 1):
return -(limit + 1)
if(dividend < -limit):
return limit
return -dividend
dend = dividend
sor = divisor
if(sor < 0):
sor = -sor
sign = not sign
if(dend < 0):
dend = -dend
sign = not sign
if(sor > dend):
return 0
a = dend
b = sor
exp = 1
while(a >= b):
exp += 1
b = pow(sor, exp)
exp -= 1
b = pow(sor, exp)
while(a >= sor):
if(a >= b):
a -= b
result += pow(sor,exp-1)
else:
exp -= 1
b = pow(sor,exp)
if(sign):
if(result > limit):
return limit
return result
else:
return -result
이 문제는 꽤 흥미로웠다. 어떤 알고리즘을 사용했다기보다, 기본적인 사칙연산의 이해가 필요한 문제였다고 생각한다. 평소에는 잘 생각하지 않고 사칙연산을 사용하다보니 원리를 다시 생각하는데 까지의 시간이 많이 들긴 했지만, 그 이후 실질적 코딩은 어렵지 않았다.
문제
https://leetcode.com/problems/divide-two-integers/
코드
https://github.com/ko-inseoklee/ProblemSolving/blob/main/29.DivideTwoIntegers.py/