Today’s key 🔑


머리 뽀개기 🔥

% 연산자를 이용하지 않고 숫자의 나머지 구하기

자바스크립트에서 % 연산자는 두 수의 나머지를 구해주는 아주 훌륭한 연산자다. 오늘 풀어본 문제는 이 % 연산자 없이 함수에 들어온 인자의 나머지를 구하는 알고리즘 문제였다.

function modulo(num1, num2) {
  // 1. 둘 중 하나가 NaN 인지 아닌지
  if (num1 === NaN || num2 === NaN) {
    return NaN;
  } else {
    // 2. num1, num2 가 특정 값을 리턴할 때.
    if (num1 === 0) {
      return 0;
    } else if (num2 === 0) {
      return NaN;
    } else if (num1 === 1) {
      return 1;
    } else if (num1 === -1) {
      return -1;
    } else if (num1 === num2) {
      return 0;

      // 3. 본격적으로 함수의 두 인자의 크기를 비교하자
    } else if (num1 > num2) {
      if (num1 > 0 && num2 < 0) {
        let numPlus2 = num2 * -1;
        return num1 - Math.floor(num1 / numPlus2) * numPlus2;
      } else if (num1 > 0 && num2 > 0) {
        return num1 - Math.floor(num1 / num2) * num2;
      } else if (num1 < 0 && num2 < 0) {
        return num1;
      }
    } else if (num1 < num2) {
      if (num1 > 0 && num2 > 0) {
        return num1;
      } else if (num1 < 0 && num2 > 0) {
        let numPlus = num1 * -1;
        return (numPlus - Math.floor(numPlus / num2) * num2) * -1;
      } else if (num1 < 0 && num2 < 0) {
        let numPlus = num1 * -1;
        let numPlus2 = num2 * -1;
        return (numPlus - Math.floor(numPlus / numPlus2) * numPlus2) * -1;
      }
    }
  }
}


아래는 동일한 문제를 쪼개서 명확하게 작성하려고 노력한 흔적이다.

if (isNaN(num2) || num2 === 0) {
  return NaN;
}


// 절대값 형성 이전에 +/- 를 미리 구분해준다.

let plusMinus =
  if (num1 > 0) {
     return 1
  } else {
     return -1
  }


num1 = Math.abs(num1);
num2 = Math.abs(num2);


while (num1 >= num2) {
  num1 = num1 - num2;
}

// num1이 음수라면 나머지 값이 음수로 나오게 된다.
return num1 * plusMinus;