computeSquareRoot

computeSquareRoot

Problem


수를 입력받아 제곱근 값을 소수점 두 자리까지 리턴해야 한다.

입력
인자 1 : num
- number 타입의 정수 (num >= 2)

출력
number 타입을 리턴해야 한다. 최대 소수점 둘째 짜리까지 구한다. (소수점 셋째 자리에서 반올림)

주의사항
Math.sqrt 사용은 금지된다.

입출력 예시

let output = computeSquareRoot(9);
console.log(output); // --> 3

output = computeSquareRoot(6);
console.log(output); // --> 2.45

Solution

바빌로니아 법(The Babylonian Method)


3000년도 더 된 기원전에 탄생한 바빌로니아 법(Babylonian method) 또는 헤론법(Heron’s method)은제곱근에 대한 근사값을 구하는 알고리즘이다.
뉴턴-랩슨 방법의 제곱근버전이라고 할 수 있다고 한다. 아이디어는 다음과 같다. \[\begin{aligned} x\times\frac{a}{x}=a=\sqrt{a}\times\sqrt{a} 이므로, \\[15pt] If\;\; x<\sqrt{a}, \quad \mathcal{then}\;\; \frac{a}{x}>\sqrt{a} \\[5pt] If\;\; x>\sqrt{a}, \quad \mathcal{then}\;\; \frac{a}{x}<\sqrt{a} \end{aligned}\]

위처럼, \(\sqrt{a}\)는 항상 \(x\)와 \(\frac{a}{x}\) 사이에 있으므로,
\(x\)와 \(\frac{a}{x}\)의 평균을 구하고, 구한 평균이 다시 \(x\)가 되어 계속해서 평균을 구해나간다면, 이는 \(\sqrt{a}\)에 근사하게 될 것이다.
따라서 \(x\)의 점화식은 다음과 같다. \[x_{n+1}=\frac{x_n+(\frac{a}{x_n})}{2}=\frac{(x_n)^2+a}{2x_n}\]

이를 구현하면 다음과 같다. (x의 초기값은 1로, 평균을 10번만 구하도록 하였다.)

// file:'ComputeSquareRoot.js'
function computeSquareRoot(a) { 
  let x=1 , aDivx, avg; 
  for(let i=0; i<10; i++) { 
    aDivx = a/x;
    avg = (x + aDivx) / 2; 
    x = avg;
  } 
  // toFixed는 숫자형을 받아 고정소수점 표기법의 문자열으로 반환하기 떄문에 다시 숫자형으로 바꿔주어야한다. (단항연산자+ 사용)
  return +x.toFixed(2); 
}

© 2022. Byungchan Park. All rights reserved.