Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
Tags
- Medium
- binary search
- linked list
- binary tree
- backtracking
- Array
- string
- Depth-first Search
- Python
- HashTable
- Binary
- list
- easy
- 리트코드
- 미디움
- hash table
- 쉬움
- sorting
- two pointers
- DP
- tree
- 문자열
- 중간
- matrix
- 이진트리
- recursive
- dfs
- math
- 재귀
- leetcode
Archives
- Today
- Total
부부의 코딩 성장 일기
LeetCode 50(Pow(x, n), Python) 본문
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 |