PS

표현 가능한 이진 트리 [2023 KAKAO BLIND RECRUITMENT]

깊게 생각하고 최선을 다하자 2023. 10. 1. 13:42

1) 문제 접근 방법

- 이 문제는 포화 이진 트리의 개념을 이해하고, 그 조건에 맞게 구현을 하는 문제이다. 

  우선은, 주어진 숫자를 이진수로 변환하고, 자리수를 2^n-1로 맞춰준다.

  자리수를 2^n-1로 맞춰준 이유는 그렇게 해야 포화 이진 트리가 될 수 있기 때문이다. 

 

- 그 다음에 이분 탐색을 통해서 노드를 탐색하는데,

   만약에 이분 탐색 시 서브 트리의 루트 노드가 0이라면, 해당 서브 트리의 자손 노드들에서는 1이 존재하면 안된다. 

   왜냐하면 그렇게 하는 것은 트리의 정의에 어긋 나기 때문이다. 

 

- 이를 위해 flag라는 변수를 통해서 판단을 해줬고, 서브 트리의 루트 노드가 0일 때는, 

   flag를 True로 처리하여, 서브 트리의 자손 노드에 전달되도록 하였다. 

 

- 그리고 만약에 서브 트리의 자손 노드 중에서 하나라도 1이 발견되면, return False를 하도록 하였다. 

 

- 서브 트리의 루트 노드가 0일 때, 해당 서브 트리의 자손 노드들에서는 1이 존재하면 안된다는 아이디어가

   제일 중요한 문제라고 할 수 있다. 

 

 

2) 소스 코드  

def binarySearch(start, end, res, flag):
    

    if start == end:
        if flag == False:
            return True 
        else: 
            if res[start] == '1':
                return False
            else:
                return True
            
    mid = (start+end) // 2 
    
    if flag == True:
    	if res[mid] == '1':
        	return False 
        
    
    if res[mid] == '1':
        return binarySearch(start, mid-1, res, False) and binarySearch(mid+1, end, res, False)
    else:
        return binarySearch(start, mid-1, res, True) and binarySearch(mid+1, end, res, True)
    
    
    
    
    
    



def changeToBinary(num):
    
    res = ""
    
    while num != 0:
        
        r = num % 2 
        
        res += str(r)
        
        num = num // 2 

    binaryLen = len(res)
    
    n = 0
    m = 1 
    
    while True: 
        
        N = 2**n-1
        M = 2**m-1 
        
        if N < binaryLen and binaryLen <= M:
            if binaryLen == M:
                break
            else:
                gap = M-binaryLen 
                
                for i in range(gap):
                    res += '0'
                
                break     
        else:
            n += 1 
            m += 1 
    
    
    
        
    return res[::-1]


def solution(numbers):
    
    answer = []
    
    for num in numbers:
        res = changeToBinary(num)
        ans = binarySearch(0, len(res)-1, res, False)
        
        if ans == True:
            answer.append(1)
        else:
            answer.append(0)
            
    
        
    return answer