제곱근 알고리즘[TIL 27일차]

JUNGHUN KIM·2021년 7월 11일
0
post-custom-banner

첫 알고리즘 포스팅이기도하고 하니 두고두고 기억하기 위해 블로깅을 시작해본다..

알고리즘 문제를 하나하나씩 풀던도중
수(num)를 입력받아 제곱근 값을 소수점 두자리까지 리턴하라는 문제가 나왔다.

주의사항

  • Math.sqrt사용은 금지

사실 이 문제의 주의사항처럼 Math.sqrt를 사용하면 문제는 정말 손쉽게 한줄의 로직이면 풀리지만 금지 되어져 있다..

Math.sqrt

이 함수는 숫자의 제곱근을 반환합니다.
주어진 숫자에 루트(√ )를 씌웁니다. 만약 숫자가 음수이면 NaN를 반환합니다.

문법
Math.sqrt(x)

실제 사용예시

let num = 500
let result =Math.sqrt(num) // 결과값22.360679774997898
Number(result.toFixed(2)) // 결과값 22.36 

1.Math.sqrt를 사용해서 입력받은 값에 루트를 씌워 제곱근을 구함
2.제곱근 전체가 나오기 때문에 소수점 두자리까지 리턴하기 위해 toFixed사용
3.toFixed는 리턴값이 문자열이기 때문에 Number()로 감싸서 Stirng을 Number타입으로 변경
4.문제해결~


하지만.. 이렇게하면 안되기 때문에 고민을 20분정도했지만 아무리 생각해도 답이 나오지 않아.. 구글선생님을 통해 동일한 문제를 겪으신 선배님들의 지혜를 빌려 어느정도 힌트를 얻어 하기 로직으로 통과하긴 하였다...(사실 내 힘으로 한건 거의 없다..)

테스트 통과된 로직

   //정수값 구하기
   //변수 halfnum을 선언하여 num을 2로 나눈다. 
  //halfnum*halfnum <num 이 성립할때까지 될때까지 halfnum -1을    
  //그렇게하면 num의 제곱근은 halfnum <= num < halfnum+1 이 된다.
 let halfnum = Math.floor(num / 2)     
  while(halfnum*halfnum>num) {
    halfnum = halfnum - 1
  }

  console.log(halfnum)
  //만약 halfnum의 제곱이 num일 경우 halfnum을 리턴
  if(halfnum*halfnum === num){
    return halfnum
  }

  console.log(halfnum)  //도중의 결과 확인

  //제곱근 소수점자리 구하기.
  let halfnum1 = halfnum + 0.001
  while(halfnum1*halfnum1 <num){
    halfnum1 = halfnum1 + 0.001
  }

  console.log(halfnum1) // 최종 결과확인

  return Number(halfnum1.toFixed(2))

처음에는 halfnum을 구한다음 halfnum1이라는 변수를 새로 지정하여
소수점 첫번쨰 자리를 구한뒤 새로운 변수 halfnum2를 다시 할당해 소수점 두번쨰 자리를 구하는 방법으로 하려고 했으나.. 엄청나게 많은 예외처리를 해야할것 같아..
소수점 세번째 자리(0.001)부터 시작하여 0.01씩 계속 추가하는 로직으로 문제를 풀었다.

나중에 문제에 대한 Reference를 확인하였을때
내가 풀이한 문제와 비슷하지만.. 내 로직에 비해 간결하고 가독성있는 로직이 기재되어져 있었다..
아직 코딩의 코자도 모르다보니 문제를 해결하는데에만 집중하고 있지만...
추후에는 가독성 및 중복제거를 위해 노력해보려고 한다..


참조사항

Math.sqrt()에 대한 MDN 주소링크
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Math/sqrt

Number.prototype.toFixed()에 대한 MDN 주소 링크
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed


profile
개발자가 되고 싶은 일문학도
post-custom-banner

0개의 댓글