Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬으로 숫자가 3의 거듭제곱인지 확인하는 방법

숫자 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을 곱하거나 나누어 확인하는 방식이 더 안전한 대안이 될 수 있습니다.