블로그를 이전 중이라 완료되기 전까지는 벨로그에 작성할 계획입니다.
이후 모든 글은 https://weekwith.me 에 작성 예정이니 다른 글이 궁금하시다면 해당 링크를 통해 방문해주세요.본 글은 [ LeetCode ] 869. Reordered Power of 2를 풀고 작성한 글입니다.
You are given an integer n
. We reorder the digits in any order (including the original order) such that the leading digit is not zero.
Return true
if and only if we can do this so that the resulting number is a power of two.
1 <= n <= 10^9
총 두 가지 풀이가 존재한다.
아래와 같이 내장 모듈 math
내에 있는 log()
함수를 활용하여 반복문의 범위를 한정하고 해당 범위 내로 반복문을 수행하며 sorted()
내장 함수를 통해 두 수를 비교해서 2의 제곱수로 만들 수 있는지 여부를 판별한다.
def solution(n: int) -> bool:
from math import log
length: int = len(str(n))
start: int = int(log(10 ** (length - 1), 2))
end: int = int(log(10 ** length, 2))
for number in range(start, end + 1):
if sorted(str(n)) == sorted(str(2 ** number)):
return True
return False
비트 연산자를 활용해서 문제를 풀 수도 있다.
최대 9자리까지인 입력값에 따라 2의 배수 또한 최대 2^30까지만 따지면 되기 때문에 2^0부터 하나씩 비트 연산을 통해서 비교하면 된다.
이때 해당 수의 개수를 따져 비교하면 순서에 상관 없이 비교할 수 있다.
def solution(n: int) -> bool:
numbers: dict[str, int] = {}
for number in str(n):
if number in numbers:
numbers[number] += 1
else:
numbers[number] = 1
for power in range(30):
target: int = 1 << power
target_numbers: dict[str, int] = {}
for number in str(target):
if number in target_numbers:
target_numbers[number] += 1
else:
target_numbers[number] = 1
if numbers == target_numbers:
return True
return False
첫 번째 풀이의 경우 sorted()
메서드를 활용하기 때문에 시간 복잡도는 O(NlogN)이고 두 번째 풀이의 경우 O(N)이다.