1 minute read

Problem

Implement pow(x, n), which calculates x raised to the power n (i.e., x^n).

Example 1:

Input: x = 2.00000, n = 10
Output: 1024.00000

Example 2:

Input: x = 2.10000, n = 3
Output: 9.26100

Example 3:

Input: x = 2.00000, n = -2
Output: 0.25000
Explanation: 2-2 = 1/22 = 1/4 = 0.25

Constraints:

  • -100.0 < x < 100.0
  • -2^31 <= n <= 2^31-1
  • n is an integer.
  • -10^4 <= x^n <= 10^4

Solution

class Solution {
    public double myPow(double x, int n) {
        double result = 1L;
        if (x == 1L || (x == -1L && n % 2 == 0)) return result;
        else if (x == -1L && n % 2 != 0) return -result;
        // Overflow case : 0으로 수렴
        else if (n == Integer.MIN_VALUE) return 0L;
        for (int i = 0; i < Math.abs(n); i++)
            result *= x;
        if (n < 0) return 1 / result;
        else return result;
    }
}

Explanation

  • n이 양수라면 x가 양수던 음수던 n제곱을 계산해주면 되지만, n이 음수라면 반환값이 분수가 된다. 이는 n이 양수일 때와 음수일 때 모두를 계산해주어야 한다는 의미가 되고, 함수가 길어질 수 있다. n의 절대값으로 계산을 마친 뒤, n이 음수라면 분수로 만들어 반환하면 1가지 경우의 수만 계산하면 된다.
  • 곱셈을 해주어야 하기 때문에, 반환할 값인 변수 result를 0이 아닌 1L로 초기화한다.
  • for반복문을 작성해 n의 절대값으로 n이 양수일 경우의 result값을 구하고 난뒤, n이 음수라면 분수로 반환하도록, n이 양수라면 분수로 변환없이 그대로 변수 result값을 반환하도록 if조건문을 작성한다.
    double result = 1L;
    for (int i = 0; i < Math.abs(n); i++)
      result *= x;
    if (n < 0) return 1 / result;
    else return result;
    
  • x가 1 혹은 -1인 경우에 반환할 값은 1L 혹은 -1L이 되므로 계산 시간을 줄이기 위해 if조건문을 상단에 작성한다.
    if (x == 1L || (x == -1L && n % 2 == 0)) return result;
    else if (x == -1L && n % 2 != 0) return -result;
    
  • 그리고 n의 절대값을 구하는 과정에서 n이 int 형 정수의 최소 값인 -2^31일 경우 Overflow가 발생할 수 있는 경우를 대비해 if조건문을 추가 작성한다.
  • n이 -2^31일 경우에는 반환 값인 변수 result가 0으로 수렴하여 결국 0으로 처리되기 때문에 0을 반환하도록 한다.
    // Overflow case : 0으로 수렴
    else if (n == Integer.MIN_VALUE) return 0L;
    

Categories:

Updated:

Leave a comment