Algorithm
[1-2][DP] 거듭제곱 빠르게 구현하기
lluna
2021. 10. 12. 11:36
다이나믹 프로그래밍
재귀적 호출을 power(x, y - 1) 대신 power(x, y // 2) 로 바꿔줌으로써
시간복잡도를 O(n)에서 O(lgn) 으로 줄일 수 있다.
홀수와 짝수를 나누어서 계산한다.
# 시간복잡도 O(n)
def power(x, y):
if y == 0:
return 1
return power(x, y - 1) * x
# 시간복잡도 O(lgn)
def power(x, y):
if y == 0:
return 1
# 계산을 한 번만 하기 위해서 변수에 저장
subresult = power(x, y // 2)
# 문제를 최대한 똑같은 크기의 문제 두 개로 나눈다.
if y % 2 == 0:
return subresult * subresult
else:
return x * subresult * subresult
# y가 8이면 4번, y가 32면 6번 호출, 즉 lg y + 1번 호출
#테스트
print(power(3, 5))
print(power(5, 6))
print(power(7, 9))