문제 |
수를 입력받아 제곱근 값을 소수점 두 자리까지 리턴해야 합니다. |
입력 |
인자 1 : num |
number 타입의 정수 (num >= 2) |
출력 |
number 타입을 리턴해야 합니다. 최대 소수점 둘째 짜리까지 구합니다. (소수점 셋째 자리에서 반올림) |
주의 사항 |
Math.sqrt 사용은 금지됩니다. |
code
function computeSquareRoot(num) {
let approx = num / 2; // 초기 근사값은 num / 2로 설정
let prevApprox; // 이전 근사값을 저장하기 위한 변수
while (true) {
// 이전 근사값과 현재 근사값의 차이가 0.01보다 작아지면 루프를 종료
if (prevApprox && Math.abs(approx - prevApprox) < 0.01) {
break;
}
prevApprox = approx; // 이전 근사값 갱신
approx = (approx + num / approx) / 2; // 새로운 근사값 계산
}
// 최종 근사값을 소수점 둘째 자리까지 반올림한 후 반환
return parseFloat(approx.toFixed(2));
}
풀이
굉장히 굉장히 개인적으로 짜증났던 문제
수학이 참 어렵다;
문제만 잠깐 보고 Math.sqrt 사용하면 되겠구먼 했더니 주의사항에 바로 사용하지 말라는 ;
코드로 도저히 수식이 생각이 안나서 여러 검색을 했더니 Math.sqrt를 사용하지 않고 제곱근 값을 소수점 두 자리까지 리턴할 때 제일 적합한 것이 바빌로니아 법을 이용해서 푸는 것이라고 한다. (힌트에도 나와있었음;)
자자, 바빌로니아 법이 도데체 뭔지 한번 보자.
바빌로니아 법은 고대 바빌론의 수학자들이 발견한 제곱근을 근사적으로 구하는 방법이라고 한다.
바빌로니아 법은 다음과 같은 점화식으로 정의된다.
Xn+1 = (Xn + num / Xn) / 2
여기서 Xn은 n번째로 계산된 근사값을 나타내며, Xn+1은 n+1번째로 계산된 근사값을 나타낸다.
num은 구하고자 하는 제곱근의 값이다.
바빌로니아 법은 초기값으로 num의 절반을 설정한 후, 위의 점화식을 반복해서 계산한다.
이 점화식은 점점 더 정확한 근사값을 계산해 나간다.
이 과정을 반복하다가, 이전 근사값과 현재 근사값의 차이가 더 이상 줄어들지 않을 때, 근사값으로서의 제곱근을 반환한다.
바빌로니아 법은 수학적으로 정확한 방법은 아니지만, 일반적으로 빠르고 정확한 결과를 얻을 수 있는 방법이라고 한다.
따라서, 대부분의 컴퓨터나 계산기에서도 이 방법을 사용한다고 한다.
그럼 바빌로니아 법을 이용하여 제곱근을 근사적으로 계산하여 나타낸 코드를 순서대로 풀어서 얘기해보자.
우선 초기값으로 num의 절반을 설정하여 approx 변수에 할당한다.
그리고 이전 근사값을 저장하기 위한 prevApprox 변수를 선언한다.
while 루프를 돌면서 바빌로니아 법의 점화식을 반복적으로 계산한다.
이전 근사값과 현재 근사값의 차이가 0.01보다 작아지면 while 루프를 종료한다.
이 때, prevApprox 변수를 사용하여 이전 근사값과 현재 근사값의 차이를 계산한다.
새로운 근사값을 계산하기 위해서는 이전 근사값과 num 값을 사용한다.
바빌로니아 법의 점화식에 따라 approx 변수에 다음과 같이 새로운 값을 할당한다.
approx = (approx + num / approx) / 2;
이 과정을 반복하면서 최종 근사값을 계산한 후, toFixed 메소드를 사용하여 소수점 둘째 자리까지 반올림한다.
마지막으로 parseFloat 메소드를 사용하여 숫자 타입으로 변환한 후, 반환한다.
추가 ++
후.. Math.pow 메서드를 알아내버렸다.
저 위에있는 풀이는 싹 잊어버릴래요
코드
function computeSquareRoot(num) {
return Number(Math.pow(num,0.5).toFixed(2))
}
위에 코드랑 비교하면 참~~~~~~~~~쉽다;
Math.pow() 메서드는 base 에 exponent를 제곱한 값을 반환하는 메서드이다.
위의 코드로 봤을 때, 여기서 말하는 base는 num 이고, exponent는 0.5 이다.
식으로 보면 num에 0.5를 제곱한다는 것이고, num의 제곱근 값을 받을 수 있다.
따라서, Math.pow() 메서드를 이용해서 제곱근 값을 받은 다음 , 문제 요구 사항 '최대 소수점 둘째 짜리까지 구합니다.' 을 만족 시키기 위해 toFixed() 메서드를 이용하여 소수점 셋째 자리에서 반올림하여 소수점 둘째 짜리까지 나타냈다.
'Coplit' 카테고리의 다른 글
[ Coplit ] - 19_ decryptCaesarCipher 문제 풀이 (0) | 2023.04.04 |
---|---|
[ Coplit ] - 18_ numberSearch 문제 풀이 (0) | 2023.04.04 |
[ Coplit ] - 16_ isIsogram 문제 풀이 (0) | 2023.04.02 |
[ Coplit ] - 15_modulo 문제 풀이 (0) | 2023.04.02 |
[ Coplit ] - 14_ superIncreasing 문제 풀이 (0) | 2023.03.31 |