Skip to content

Expressible binary tree

1. Problem

해당 문제는 여기에서 확인하실 수 있습니다.

2. Answer

def solution(numbers):
    def check(tree: str) -> bool:
        # 트리 문자열이 유효한지 확인하는 함수
        if len(tree) == 1:
            return True
        mid = len(tree) // 2
        root = tree[mid]
        left = tree[:mid]
        right = tree[mid+1:]
        # 루트가 0인데 자식 중에 1이 있으면 불가능
        if root == '0':
            if '1' in left or '1' in right:
                return False
        # 왼쪽, 오른쪽 서브트리를 재귀적으로 검사
        return check(left) and check(right)

    def to_full_binary(num: int) -> str:
        # 숫자를 2진수로 변환하고 포화 이진트리 길이에 맞춰 0으로 패딩
        b = bin(num)[2:]
        length = len(b)
        full_len = 1
        while full_len < length:
            full_len = full_len * 2 + 1
        return b.zfill(full_len)

    answer = []
    for num in numbers:
        # 포화 이진트리에 맞는 2진수 문자열 생성
        tree = to_full_binary(num)
        # 유효성 검사 결과에 따라 1 또는 0 추가
        if check(tree):
            answer.append(1)
        else:
            answer.append(0)
    return answer