[ 문제 ]
문제를 읽자마자 바로 나머지 연산자(%)를 사용해야겠다, 라고 생각했는데
주의사항에 나눗셈(/), 나머지(%)연산자 사용금지라고 되어있었다...
저 두 연산자를 모두 사용하지 않으면 이 문제를 어떻게 풀어야하나.. 감이 오지 않았는데,
예전에 비슷한 문제를 풀었던 기억이 났다.
나누는 값으로 -값이 되기 전까지 계속해서 빼면 되는 것이다!
[ 풀이 ]
나의 로직은 다음과 같다.
while 반복문을 이용하여 나누는 값으로 반복적으로 -를 하여 나머지값을 구한다.
function modulo(num1, num2) { // (5, 2)
if(num1 === 0) { //주의사항에 적힌대로, 0은 어떤 수로 나누어도 나머지가 0이다.
return 0;
} else if(num2 === 0){ //주의사항대로, 0으로 나누면 아래의 메시지를 리턴한다.
return 'Error: cannot divide by zero';
}
while(num1 > 0){ //num1값이 0보다 크면 계속 반복문을 돌린다.
num1 = num1 - num2; //num1값이 0보다 크면 num1-num2를 빼고, num1에 재할당한다.
if(num1 < num2){ //num2를 빼고난 후, num1<num2이면
return num1; //num1값을 리턴한다. 왜냐하면 num1이 num2보다 작으면, num1-num2를 또 하면 -값이 되기때문에.
}
}
}
예전에 내가 적었던 풀이를 다시 살펴보는데, 이게 훨씬 깔끔한것같다...
function modulo(num1, num2) {
if (num2 === 0){
return 'Error: cannot divide by zero'
}
if(num1 === 0){
return 0
}
let result = num1;
while(result >= num2){ //여기서 바로 num1, num2값을 비교하는 것.
result = result - num2;
} //num2가 result값보다 더 크면 반복문을 멈추고 result값을 return한다.
return result;
}
[ 레퍼런스 ]
function modulo(num1, num2) { //만약 (0,1)일 경우,
if (num2 === 0) {
return 'Error: cannot divide by zero';
}
while (num1 >= num2) { // 0 < 1
num1 = num1 - num2;
}
return num1; //num1 = 0
}
레퍼런스를 보고,
왜 '0은 어떤 수로 나누어도 나머지가 0입니다'라는 주의사항에 대한 코드 if(num1 === 0){return 0} 가 없는지 궁금했다.
만약 num1값이 0, num2값이 0일 경우 while반복문이 무한대로 돌지 않나..?
하지만 어떤 수도 0으로 나눌 수 없다"라는 주의사항으로 (0, 0)의 값은 성립되지 않고,
num1 = 0, num2 = 1의 값을 대입해보면
무조건 num2값이 num1보다 크기때문에 반복문은 작동되지 않고 바로 num1값이 return된다.
오.. 이 코드가 훨씬 깔끔하다.
'자료구조알고리즘 > 코드스테이츠 Coplit' 카테고리의 다른 글
18_numberSearch (0) | 2022.03.25 |
---|---|
16_isIsogram (0) | 2022.02.25 |
14_superIncreasing (0) | 2022.02.22 |
11_removeExtremes (0) | 2022.02.18 |
10_insertDash (0) | 2022.02.18 |