LeetCode (13) - Sqrt(x)(파이썬, python)

1 분 소요

❓ 문제

Given a non-negative integer x, compute and return the square root of x.

Since the return type is an integer, the decimal digits are truncated, and only the integer part of the result is returned.

Note: You are not allowed to use any built-in exponent function or operator, such as pow(x, 0.5) or x ** 0.5.

Example 1:

Input: x = 4
Output: 2

Example 2:

Input: x = 8
Output: 2
Explanation: The square root of 8 is 2.82842..., and since the decimal part is truncated, 2 is returned.

Constraints:

  • 0 <= x <= 231 - 1

Given Code

class Solution:
    def mySqrt(self, x: int) -> int:
        

내 풀이 (1트)

class Solution:
    def mySqrt(self, x: int) -> int:
        res = 0
        while 0 > (res + 1)**2 - x - 1:
            res += 1
        return res

역시나 처음부터 쭉쭉 올라가면 안된다…(시간 초과) 뉴턴 메소드 같은걸 써야하나… 생각하면서 제곱근을 찾는 알고리즘을 찾아봤는데 바빌로니아 법이라는게 있더군요


내 풀이 (2트, 바빌로니아 법)

근데 이게 어디서 튀어나왔는지, 믿을만한것인지 모르겠어서 원리를 파악해봤습니다.

k에 대한 제곱근은 f(x) = x^2 - k 의 해 입니다.

Newton’s methods와 역시 연관이 있더군요.여길 참조하세요 (https://ko.wikipedia.org/wiki/%EB%89%B4%ED%84%B4_%EB%B0%A9%EB%B2%95)

x_(t+1) = x_t - f(x) / 2(f’(x))

f’(x) = 2x

를 이용해

x_(t+1) = x_t - f(x) / 2(f’(x)) = x_t - (x_t^2 - k)/(2x_t) = (1/2)(x_t + k/x_t) 를 확인했습니다.

이제 이거 적절히 반복해주면 될거같네요!