ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2023 KAKAO BLIND RECRUITMENT - 표현 가능한 이진트리
    코딩 테스트/Level 3 2023. 1. 8. 01:57
    반응형

    https://school.programmers.co.kr/learn/courses/30/lessons/150367

    포화 이진 트리: 트리내 요소의 개수 = 2 ** n - 1

    '0' 노드의 아래 노드는 모두 '0'이어야 한다. 

    def solution(numbers):
        def is_tree(s, parent):
            if parent == '0' and not all(child == '0' for child in s):
                return False
            if len(s) == 1:
                return True
            return is_tree(s[:(center := len(s) // 2)], s[center]) and is_tree(s[center + 1:], s[center])
    
        def to_bin(num):
            s = bin(num)[2:]
            return '0' * (2 ** (int(log2(len(s))) + 1) - 1 - len(s)) + s
    
        from math import log2
        return [1 if is_tree((s := to_bin(num)), s[len(s) // 2]) else 0 for num in numbers]
    테스트 1 〉	통과 (0.02ms, 10.2MB)
    테스트 2 〉	통과 (0.04ms, 10.2MB)
    테스트 3 〉	통과 (0.06ms, 10.2MB)
    테스트 4 〉	통과 (0.18ms, 10.3MB)
    테스트 5 〉	통과 (0.42ms, 10.2MB)
    테스트 6 〉	통과 (0.86ms, 10.2MB)
    테스트 7 〉	통과 (1.01ms, 10.3MB)
    테스트 8 〉	통과 (0.53ms, 10.3MB)
    테스트 9 〉	통과 (5.58ms, 10.3MB)
    테스트 10 〉	통과 (47.51ms, 11MB)
    테스트 11 〉	통과 (51.36ms, 11.4MB)
    테스트 12 〉	통과 (48.49ms, 11.4MB)
    테스트 13 〉	통과 (43.66ms, 11MB)
    테스트 14 〉	통과 (41.91ms, 11.1MB)
    테스트 15 〉	통과 (31.86ms, 10.7MB)
    테스트 16 〉	통과 (111.71ms, 11.4MB)
    테스트 17 〉	통과 (119.57ms, 11.4MB)
    테스트 18 〉	통과 (95.79ms, 11.1MB)
    테스트 19 〉	통과 (93.66ms, 11.1MB)
    테스트 20 〉	통과 (55.20ms, 10.7MB)

    읽기 편하게 풀어보면..

    from math import log2
    
    
    def is_tree(s, parent):
        if parent == '0':
            if not all(child == '0' for child in s):
                return False
        if len(s) == 1:
            return True
        center = len(s) // 2
        return is_tree(s[:center], s[center]) and is_tree(s[center + 1:], s[center])
    
    
    def to_bin(num):
        s = bin(num)[2:]
        s_length = int(log2(len(s))) + 1
        digit = 2 ** s_length - 1
        return '0' * (digit - len(s)) + s
    
    
    def solution(numbers):
        answer = []
        for num in numbers:
            s = to_bin(num)
            if is_tree(s, s[len(s) // 2]):
                answer.append(1)
            else:
                answer.append(0)
        return answer

    로그를 쓰지 않고 푼다면.. 

    def is_tree(s, parent):
        if parent == '0':
            if not all(child == '0' for child in s):
                return False
        if len(s) == 1:
            return True
        center = len(s) // 2
        return is_tree(s[:center], s[center]) and is_tree(s[center + 1:], s[center])
    
    
    def solution(numbers):
        answer = []
        for number in numbers:
            bs = bin(number)[2:]
            digit = 0  # 포화 이진트리가 되기 위한 문자열의 길이
            for i in range(51):
                digit = 2 ** i - 1
                if digit >= len(bs):
                    break
            bs = '0' * (digit - len(bs)) + bs
            answer.append(1 if is_tree(bs, bs[len(bs) // 2]) else 0)
        return answer
    테스트 1 〉	통과 (0.01ms, 10.2MB)
    테스트 2 〉	통과 (0.05ms, 10.2MB)
    테스트 3 〉	통과 (0.06ms, 10.3MB)
    테스트 4 〉	통과 (0.21ms, 10.3MB)
    테스트 5 〉	통과 (0.47ms, 10.1MB)
    테스트 6 〉	통과 (0.78ms, 10.3MB)
    테스트 7 〉	통과 (1.21ms, 10.2MB)
    테스트 8 〉	통과 (0.84ms, 10.2MB)
    테스트 9 〉	통과 (6.16ms, 10.2MB)
    테스트 10 〉	통과 (53.36ms, 11MB)
    테스트 11 〉	통과 (60.98ms, 11.2MB)
    테스트 12 〉	통과 (57.60ms, 11MB)
    테스트 13 〉	통과 (52.23ms, 11MB)
    테스트 14 〉	통과 (47.56ms, 11MB)
    테스트 15 〉	통과 (35.98ms, 10.6MB)
    테스트 16 〉	통과 (144.51ms, 11.2MB)
    테스트 17 〉	통과 (112.64ms, 11.3MB)
    테스트 18 〉	통과 (101.80ms, 11.1MB)
    테스트 19 〉	통과 (95.21ms, 11MB)
    테스트 20 〉	통과 (59.65ms, 10.5MB)
    반응형
Designed by Tistory.