https://leetcode.com/problems/divide-two-integers/
dividend와 divisor 주어질 때 곱하기, 나누기, 나머지 연산자 없이 나눈 몫 반환하기
(몫이 정수 범위 내로 제한해서 반환)
비트로 하는 방법도 있었던 것 같은데 기본적인 연산 방식을 기반으로 풀었다. 특정 연산자를 사용 못하기에 단순 while문 기반의 뺄셈으로 나눗셈을 진행하였다. 나눠지는 수에 나눠야할 수를 빼면서 빼지는 값 자체가 나누는 수보다 작아질때까지 횟수를 세면 그 값이 몫이 된다.
다음은 정수 범위 제한으로 인해 고려해야할 분기점들이다.
우선 정수 제한 범위를 기준으로 나눠지는 수가 절대값 기준 나누는 수보다 큰 케이스와 크지 않은 케이스로 나눴다. 밑의 1, 3케이스는 나눠지는 수의 절대값 자체가 더 크기에 계산을 하면 되고 3과 4의 경우는 나누는 수 자체의 절대값이 더 크므로 0을 반환해준다.
1. 나눠지는 수 = 정수 최소
2. 나눠지는 수 != 정수 최소, 나누는 수 = 정수 최소 => 0 반환
3. 나눠지는 수 = 정수 최대
4. 나눠지는 수 != 정수 최대, 나누는 수 정수 최대 => 0 반환
절대값으로 한번에 처리해볼려고 했는데 정수 제한에 걸릴 때 뺄셈 처리가 애매해서 그냥 모든 케이스 세세하게 나눴다.
public class Solution {
public int Divide(int dividend, int divisor)
{
if (dividend == divisor) return 1;
if (dividend == 0) return 0;
if (divisor == 1) return dividend;
if (divisor == -1)
{
if (dividend == int.MinValue) return int.MaxValue;
else return dividend * -1;
}
int quotient = 0;
// 나눠지는 수 정수 최소
if (dividend == int.MinValue)
{
if (divisor == int.MaxValue) return -1;
int tmpDivisor = divisor < 0 ? divisor : -divisor;
while(dividend <= tmpDivisor)
{
quotient++;
dividend -= tmpDivisor;
}
return (divisor > 0) ? -quotient : quotient;
}
// 나눠지는 수 정수 최소 아닌데 나누는 수가 최소인 케이스
if (divisor == int.MinValue) return 0;
// 나눠지는 수 정수 최대
if (dividend == int.MaxValue)
{
int tmpDivisor = divisor > 0 ? divisor : -divisor;
while(dividend >= tmpDivisor)
{
quotient++;
dividend -= tmpDivisor;
}
return (divisor < 0) ? -quotient : quotient;
}
// 나눠지는 수 정수 최소, 최대 아닌데 나누는 수가 최대인 케이스
if (divisor == int.MaxValue) return 0;
int abs_dividend = Math.Abs(dividend);
int abs_divisor = Math.Abs(divisor);
while (abs_dividend >= abs_divisor)
{
quotient++;
abs_dividend -= abs_divisor;
}
return (((dividend < 0) && (divisor < 0)) || ((dividend > 0) && (divisor > 0))) ? quotient : -quotient;
}
}