숫자 n이 주어졌을 때, 이 숫자가 3의 거듭제곱인지 판별하는 문제입니다. 예를 들어 n = 27이라면 27은 3³이므로 결과는 true가 되고, n = 15라면 3의 거듭제곱이 아니므로 결과는 false가 됩니다.
해결 방법
이 문제는 로그(logarithm)를 활용하면 간단하게 해결할 수 있습니다. 접근 방식은 다음과 같습니다.
- 로그 연산을 사용해 문제를 해결합니다.
- [log₁₀(n) / log₁₀(3)] mod 1 == 0 이면 그 수는 3의 거듭제곱이고, 그렇지 않으면 3의 거듭제곱이 아닙니다.
원리는 다음과 같습니다. 만약 n = 3k(k는 정수)이라면, 양변에 로그를 취했을 때 log₁₀(n) / log₁₀(3) = k가 되어 나눗셈 결과가 항상 정수가 됩니다. 반대로 n이 3의 거듭제곱이 아니라면 이 값은 정수가 되지 않습니다.
예제 코드
다음 구현을 살펴보면 더 잘 이해할 수 있습니다.
import math
class Solution(object):
def isPowerOfThree(self, n):
"""
:type n: int
:rtype: bool
"""
if not n or n < 0:
return False
return (math.log10(n) / math.log10(3)) % 1 == 0
ob1 = Solution()
print(ob1.isPowerOfThree(27))
print(ob1.isPowerOfThree(15))
print(ob1.isPowerOfThree(9))
입력
27
15
9
출력
true
false
true
참고 사항
코드에서는 n이 0이거나 음수인 경우를 먼저 걸러냅니다. 로그는 양수에 대해서만 정의되기 때문입니다. 또한 부동소수점 오차로 인해 매우 큰 수에서는 로그 기반 방식이 부정확할 수 있으므로, 이런 경우에는 반복적으로 3을 곱하거나 나누어 확인하는 방식이 더 안전한 대안이 될 수 있습니다.