def makeBinaryNumber(number):
reverseBinaryNumber = []
while number != 1:
reverseBinaryNumber.append(str(number % 2))
number //= 2
reverseBinaryNumber.append("1")
binaryNumber = ''.join(reverseBinaryNumber[::-1])
binaryTreeSize = 1
# 강제로 포화이진트리로 만들어줌!!
while binaryTreeSize < len(binaryNumber):
binaryTreeSize = (binaryTreeSize + 1) * 2 - 1
binaryNumber = "0" * (binaryTreeSize - len(binaryNumber)) + binaryNumber
return binaryNumber
# 재귀 Dec to Bin
def dec2bin(number):
if (number // 2 == 0):
return str(number % 2)
return dec2bin(number//2) + str(number % 2)
def isPossible(start, end, binStr):
if start == end:
return binStr[start]
mid = (start + end) // 2
left = isPossible(start, mid - 1, binStr)
if not left or (binStr[mid] == "0" and left == "1"): return False
right = isPossible(mid + 1, end, binStr)
if not right or (binStr[mid] == "0" and right == "1"): return False
if (left == "0" and right == "0" and binStr[mid] == "0"): return "0"
return "1"
def solution(numbers):
answer = []
for number in numbers:
num_str = ""
# 단순히 홀짝만 맞춘다고 해결이 되지 않음!!
# => 재귀에서 포화이진트리를 가정하기 때문!
# if(len(dec2bin(number)) % 2 == 0):
# num_str = "0" + dec2bin(number)
# else:
# num_str = dec2bin(number)
num_str = makeBinaryNumber(number)
# print(num_str)
if isPossible(0, len(num_str)-1, num_str):
answer.append(1)
else:
answer.append(0)
return answer
📌 memo
모든 노드가 2개의 자식 노드를 갖는 트리
(Leaf 노드는 0개의 자식 노드를 가짐)
모든 노드가 왼쪽부터 순서대로 채워져 있는 트리
(0, 1, 2, 4, 8, ...)
정 이진트리이면서 완전 이진트리인 경우
모든 리프 노드의 레벨이 동일하고, 모든 레벨이 가득 채워져 있는 트리
(정 이진트리의 개수 : 1, 3, 7, 15, ...)
왼쪽 자식, 오른쪽 자식 노드의 개수가 한쪽으로 지나치게 치우치지 않은 트리
(트리가 한쪽으로 치우져져 있는 경우, 시간 복잡도가 악화되므로 균형된 트리를 만드는 것이 중요!)
😊 십진수 ~ 이진수 변환
dec2bin() 함수 - https://velog.io/@rhkr9080/Python-10%EC%A7%84%EC%88%98-2%EC%A7%84%EC%88%98-%EB%B3%80%ED%99%98