Week 01 ~ 04 : 알고리즘 문제 풀이

파이썬 백준 11286 절댓값 힙

정글러 2021. 11. 17. 19:41
import sys  
input = sys.stdin.readline

heap = ['']
n = int(input())
for i in range(n) : 
    e = int(input())
    if e == 0 : 
        if heap == [''] : 
            print(0)
        else : 
            e = heap[-1]
            heap[1], heap[-1] = heap[-1], heap[1]
            print(heap[-1])
            del heap[-1]
            index = 1
            while index * 2 < len(heap) : 
                a = index * 2
                if len(heap) == index * 2 + 1 : 
                    next = a
                else : 
                    b = a + 1
                    if abs(heap[a]) < abs(heap[b]) : 
                        next = a
                    elif abs(heap[a]) == abs(heap[b]) and heap[a] <= heap[b] : 
                        next = a
                    else : 
                        next = b
                if abs(e) > abs(heap[next]) : 
                    heap[index], heap[next] = heap[next], heap[index]
                    index = next
                elif abs(e) == abs(heap[next]) and e > heap[next] : 
                    heap[index], heap[next] = heap[next], heap[index]
                    index = next
                else : 
                    break
    else : 
        heap.append(e)
        index = len(heap) - 1
        while index > 1 : 
            if abs(e) < abs(heap[index//2]) : 
                heap[index], heap[index//2] = heap[index//2], heap[index]
                index = index // 2
            elif abs(e) == abs(heap[index//2]) and e < heap[index//2] : 
                heap[index], heap[index//2] = heap[index//2], heap[index]
                index = index // 2
            else : 
                break

먼저 구현해둔 1928 최소 힙의 코드(https://uneducatedjungler.tistory.com/51)를 바탕으로, if문 내를 절댓값의 대소관계로 바꾸어준다.

추가적으로, -x와 x가 있다면 -x가 먼저 나와야 하니 절댓값이 같은 경우에도 힙 내의 정렬이 필요하다.

절댓값이 같지만 부호가 다른 경우도 elif로 조건문을 넣어 정렬해주었다.

조건문 내부의 명령은 똑같으니 and, or를 이용해서 하나의 조건문에 넣어도 됐을 것 같다.