<Medium> Divide Two Integers (LeetCode : C#)

이도희·2023년 4월 6일
0

알고리즘 문제 풀이

목록 보기
50/185

https://leetcode.com/problems/divide-two-integers/

📕 문제 설명

dividend와 divisor 주어질 때 곱하기, 나누기, 나머지 연산자 없이 나눈 몫 반환하기
(몫이 정수 범위 내로 제한해서 반환)

  • Input
    dividend, divisor
  • Output
    나눗셈 후 몫 반환

예제

풀이

비트로 하는 방법도 있었던 것 같은데 기본적인 연산 방식을 기반으로 풀었다. 특정 연산자를 사용 못하기에 단순 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;
                
    }

}

결과

profile
하나씩 심어 나가는 개발 농장🥕 (블로그 이전중)

0개의 댓글