[SEB FE] Section 2 Daily Coding
computeSquareRoot
💡 바빌로니아 법의 점화식을 사용해 Math.sqrt을 구현하기
문제
수를 입력받아 제곱근 값을 소수점 두 자리까지 리턴해야 합니다.
입력
인자 1 : num
- number 타입의 정수 (num >= 2)
출력
- number 타입을 리턴해야 합니다.
- 최대 소수점 둘째 짜리까지 구합니다. (소수점 셋째 자리에서 반올림)
주의 사항
- Math.sqrt 사용은 금지됩니다.
입출력 예시
let output = computeSquareRoot(9);
console.log(output); // --> 3
output = computeSquareRoot(6);
console.log(output); // --> 2.45
힌트
- 소수점 처리는 javascript 표준 내장 객체인 Number를 검색해 봅니다. (js decimal places limit 또는 자바스크립트 소수점 자릿수)
- 항상 타입을 주의하여야 합니다.
- 각 자릿수(1, 0.1, 0.01, 0.001)마다 (목푯값을 넘지 않는) 근삿값을 구하는 방식이 있습니다.
- 제곱근을 구하는 방법 중 바빌로니아 법이 있습니다. 바빌로니아 법의 점화식(recurrence formula)을 이해할 수 있다면, 해당 식을 이용해 문제를 풀어도 좋습니다.
풀이
function computeSquareRoot(num) {
const diffs = [1, 0.1, 0.01, 0.001];
let base = 1;
for (let i = 0; i < diffs.length; i++) {
while (base * base < num) {
base = base + diffs[i];
}
if (base * base === num) {
return base;
} else {
base = base - diffs[i];
}
}
return Number(base.toFixed(2));
}
base에 1을 더해서 제곱한 값을 매개변수 num과 비교하고, 작으면 num보다 같거나 커질 때까지 1을 추가로 더한다.
만약에 base의 제곱이 num과 일치하면 return 하고 아니면 num보다 1이 더 크다는 의미이기 때문에 1을 빼준다.
다음으로 0.1을 더해가면서 num과 비교한다. 여기서도 제곱이 num과 일치하는 값(제곱근)을 찾지 못했으면 더 작은 0.01, 0.001을 차례대로 더해가면서 비교하고 근삿값을 찾아간다.
그렇게 num의 제곱근과 일치하거나 거의 일치해진 base를 toFixed를 사용해 소수점 둘째 자리로 반올림을 한다.
toFixed는 string 타입을 반환하기 때문에 Number를 사용해서 숫자 값으로 만들어주고 최종적으로 리턴한다.