일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 라매개발자
- 나도코딩
- 단계별로 풀어보기
- 백준 정리
- max-width
- margin 0 auto
- 할만한데?
- nav태그
- WEB2-JavaScript
- git
- 백준 자바스크립트
- 백준
- calc()
- 크롬웹
- button:focus cursor: pointer; outline: none;
- li 태그
- 생활코딩 WEB2-JavaScript
- HTML
- Pull
- 드림코딩
- 코딩테스트
- :root
- 노마드 코더
- error: ENOENT: no such file or directory
- border radius
- html 끝
- 나도코딩 파이썬
- git 버전관리
- 생활코딩
- box-sizing: border-box
- Today
- Total
코딩응애의 개발블로그
코플릿 문제 풀면서 알게된 것들 - 바빌로니아 법 (제곱근) 본문
코플릿 문제를 푸는데 Math.sqrt()를 쓰지않고 제곱근을 구하는 문제를 푸는데 바빌로니아 법 이라는것을 처음 알게됨
바빌로니아 법
임의의 수의 제곱근에 빠르게 수렴하는 수열을 만들어 근삿값을 구하는 방법이라고 한다. 예를 들자면
양의 실수 a에 대하여 다음 과정을 따라 √a의 근삿값을 구할 수 있다.
- 임의의 양의 실수 Xn을 택한다. 이 값이 √a에 가까울수록 더 빨리 근삿값을 구할 수 있다.
3. 원하는 정밀도에 이르기까지 2의 과정을 반복한다.
위에 식을 이용해서 코드를 짠게 바로
function computeSquareRoot(num) {
// TODO: 여기에 코드를 작성합니다.
let first = 1;
while (first ** 2 !== num) {
if (Number((first ** 2).toFixed(2)) === num) {
break;
}
first = (first + (num / first)) / 2;
}
return Number(first.toFixed(2));
}
코드를 설명하자면 while문으로 근사값(first)을 제곱을 했을때 주어진 수(num)와 같지 않다면 반복하게 하는데
바빌로니아 법 저 식을 이용해도 근사값이 주어진 수의 제곱근과 가까워 지기는 하지만 완전히 같아지지는 않기 때문에
중간에 if문을 이용해서 break를 해줘야 무한반복이 되는것을 막아줄 수 있다.
근데 처음에 저 if문 코드가 이해가 가지 않았다 toFixed로 소수점 2째자리 까지 하면 num과 같아질 수 가 없지 않나? 라는
의문이 있었는데 num이 6이라고 가정을 하고 설명을 해보자면
처음돌때 first 값은 first = (first + (num / first)) / 2; 이 코드로 인해 3.5가 되고 제곱하면 12.25로 다르니까 다시 반복
그다음 first 값은 2.6071... 제곱하면 6.79719... 이런식으로 반복을 하다가 어느순간 빠져나오게 되는데
first 값 3.5
first 제곱한값 12.25
first 값 2.607142857142857
first 제곱한값 6.79719387755102
first 값 2.454256360078278
first 제곱한값 6.023374280984678
first 값 2.4494943716069653
first 제곱한값 6.0000226765342015
제곱한 값이 6.0000226... 이때 저 if문 조건에 맞아서 빠져나오게 된다 근데 주어진 수 6이랑 다르잖아!! 라며 혼자 계속 고민하다가 toFixed(2)로 6.00으로 만들어 준값이 6과 같다고 나온다
console.log(6.00 === 6) // true 출력
이 점을 이용해서 while문을 빠져나오고 해결! 저 바빌로니아 법을 알아도 while문을 어떻게 빠져나오는지
코드로 구현하는게 중요한것 같다 그걸 모르면 못풀음
'코드스테이츠(부트캠프)' 카테고리의 다른 글
리액트 SPA 라우터 (0) | 2022.08.18 |
---|---|
코플릿 풀면서 알게된 점 (정규식과 replaceAll() & /[^0-9]/g) (0) | 2022.08.16 |
코드스테이츠 블로깅 - (REST API) + 생활코딩 (REST API) (0) | 2022.08.05 |
코플릿 문제 풀면서 알게된 것들 - 배열안에 특정 값 제거 (0) | 2022.08.04 |
코플릿 문제 풀면서 알게된 것들 - replace() (0) | 2022.08.01 |