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
반응형
'junior developer :) > 알고리즘 & 코딩테스트' 카테고리의 다른 글
알고리즘 (n개 중 3개의 요소를 곱해 나올 수 있는 최대값 구하기(sort()) (0) | 2022.10.21 |
---|---|
재귀함수에 대해서_factorial (+ 논리 곱 & 논리 합) (0) | 2022.10.20 |
알고리즘 연습_이차원 배열 안에서 특정 문자 찾기 (0) | 2022.10.14 |
알고리즘 연습_문자열 변형 JS (Reverse, UpperCase) (0) | 2022.09.27 |
프로그래머스 _문자열을 정수로 바꾸기, 평균구하기(Level.1/JS) (2) | 2022.09.05 |