본문 바로가기
junior developer :)/알고리즘 & 코딩테스트

알고리즘_ 바빌로니아법으로 제곱근 구하기(toFixed())

by ㅁ윤슬ㅁ 2022. 10. 14.
728x90
반응형
Q. 수를 입력받아 제곱근 값을 소수점 두자리까지 리턴해야 합니다 (Math.sqrt 사용 금지)

ex. 인자가 9일 때는 결과 값 3 , 인자가 6일 때는 결과 값 2.45

바빌로니아 법

제곱근을 구하는 법을 검색하다가 찾은 바빌로니아 법

원래는 수학공식이라 검색하니 알 수 없는 공식만 나와 있을 뿐...

간단하게 생각하면 a = (a + (구하려고 하는 값/ a)) /2 로 생각하면 된다.
이해를 위해 계산기로 직접 숫자를 대입해 계산해봤다

6의 제곱근을 2자리수까지 구해보자

(2 + (6 / 2)) / 2 = 2.5
(2.5 + (6 / 2.5)) / 2 = 2.45
(2.45+ (6 / 2.45)) / 2 = 2.4494897959
(2.4494897959+ (6 / 2.4494897959)) / 2 = 2.4494897428

이렇게 제곱근에 가까워지는 값을 확인할 수 있다.

이 식을 적용해서 코드를 구현해 보았다

나의 풀이 방법
function squareRoot(num) {

  let mutipleNum = 1
  while(true)
  {
    if(mutipleNum ** 2 === num)
      return mutipleNum
      //9 처럼 제곱근이 바로 정수로 나오는 경우 바로 해당 값 리턴
      
    else if(mutipleNum ** 2 > num){
      mutipleNum = mutipleNum - 1
      break // 무한루프 빠지지 않게 주의!!!
    }
   
    // 6의 경우 4(2의 제곱) < 6 < 9(3의 제곱) 사이에 있기 때문에
    // 제곱 한 값이 num(6)이 넘으면 1을 빼서 계산
    mutipleNum ++
  }
  
  let count = 0
  while(true){
    count++
    if(count === 100) //많이 게산할 수록 정확한 제곱근이 나오기 때문에 100번 계산
      return Number(mutipleNum.toFixed(2)) //100번 계산이 끝나면 toFixed를 이용해 2번쨰 자리에서 반올림
    mutipleNum = (mutipleNum + (num/mutipleNum))/2
  }
  
}

바빌로니아법을 이용하지 않은 다른 풀이도 있었다

다른 해결 방법
function SquareRoot(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));
}

두번째 자리까지 있는 배열을 만들어서 더해가며 값을 만드는 방식으로 구현한 것 같다.
1의 자릿수부터 반올림을 위해 소숫점 셋째 자리의 수까지 계산하고 더한다.

 

이 문제를 풀면서 toFixed()메소드를 새로 사용해봤다
괄호 안에 해당하는 자릿수를 넣으면 그 자릿수까지 반올림되어 적용된다 


참고

https://intrepidgeeks.com/tutorial/javascript-square-root-with-babylonian-method

https://s-realstory.tistory.com/17

https://jjanddakdevlogg.tistory.com/entry/제곱근-구하기-바빌로니아법-toFixed

728x90
반응형