부부의 코딩 성장 일기

LeetCode 50(Pow(x, n), Python) 본문

Algorithm/LeetCode

LeetCode 50(Pow(x, n), Python)

제로_콜라 2024. 1. 7. 19:00

1. 문제 링크

 

- LeetCode

Can you solve this real interview question? - Implement pow(x, n) [http://www.cplusplus.com/reference/valarray/pow/], which calculates x raised to the power n (i.e., xn).   Example 1: Input: x = 2.00000, n = 10 Output: 1024.00000 Example 2: Input: x = 2.1

leetcode.com

2. 문제 설명

  • x와 n이 주어지면 x의 n제곱을 반환하기

3. 처음 풀이

  • 그냥 x**n 하면 되는데 그게 출제 의도는 아닌 것 같다.
  • x가 0이나 1이면 그대로 x를 반환하고
  • x가 -1이면 n의 홀짝에 따라 1, -1을 반환하고
  • n이 0이면 1을 반환하는 것으로 특수 케이스를 미리 처리.
  • 그외의 경우에는 우선 x, n의 절댓값을 각각 y, m이라 하고 y의 m제곱을 계산한다.
  • 이때, 2의 10제곱이라고 하면 1번씩 곱하여서 2제곱, 3제곱, 4제곱,… 하면 오래 걸리기 때문에 두배씩해서
  • 2의 10제곱에서 10은 짝수이므로 4의 5제곱으로 본다.
  • 5제곱에서 5는 홀수, 즉 (4+1)제곱이므로 4를 먼저 곱한 다음 4의 4제곱을 곱하는 것으로 본다.
  • 4제곱의 4는 짝수이므로 16의 2제곱, 마찬가지로 256의 1제곱으로 볼 수 있다.
  • 따라서 4 곱하기 256의 1제곱이고 따라서 1024가 된다.
  • 마지막에 n이 부호면 곱한 값을 역수처리하고 x가 음수이면 부호 바꾸어준다.
class Solution:
    def myPow(self, x: float, n: int) -> float:
        if x == 0 or x == 1:
            return x
        if x == -1:
            if n%2 == 0:
                return 1
            else:
                return -1
        if n == 0:
            return 1
        y = abs(x)
        m = abs(n)
        product = 1
        
        while m >= 1:
            if m%2 == 1:
                product *= y
            m = m//2
            y *= y
        
        if n < 0:
            product = 1/product
        
        if x <0 and n%2 == 1:
            return -product
        else:
            return product

4. 다른 풀이

  • 지수를 절반씩 나눈다는 것은 비슷한 로직인데 재귀함수로 이용하였고, 홀짝을 따질 때 비트연산 p&1을 이용할 수 있다.
class Solution:
    def myPow(self, x: float, n: int) -> float:
        def helper(n, p):
            if p==0 or n==1: return 1
            if p<0: return 1/helper(n, -p)
            rs = helper(n*n, p//2)
            return rs * n if p&1 else rs
        return helper(x, n)

5. 배운 점

  • n의 홀짝을 따질 때 n&1을 이용할 수 있음.
  • return 안에 if~else를 이용할 수 있다.

'Algorithm > LeetCode' 카테고리의 다른 글

LeetCode 54(Spiral Matrix, Python)  (0) 2024.01.09
LeetCode 53(Maximum Subarray, Python)  (1) 2024.01.08
LeetCode 49(Groupd Anagrams, Python)  (0) 2024.01.06
LeetCode 48(Rotate Image, Python)  (1) 2024.01.05
LeetCode 47(Permutations II, Python)  (0) 2024.01.04