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를 이용해서 하나의 조건문에 넣어도 됐을 것 같다.
'Week 01 ~ 04 : 알고리즘 문제 풀이' 카테고리의 다른 글
파이썬 백준 12846 무서운 아르바이트 (0) | 2021.11.17 |
---|---|
파이썬 백준 2696 중앙값 구하기 (0) | 2021.11.17 |
파이썬 백준 1927 최소 힙 (0) | 2021.11.17 |
파이썬 백준 14003 가장 긴 증가하는 부분 수열 5 (0) | 2021.11.17 |
파이썬 백준 14002 가장 긴 증가하는 부분 수열 4 (0) | 2021.11.17 |