최소 값과 최대 값을 빠르게 찾을 수 있게 도와주는 힙(Heap)

세그먼트 트리 (Segment Tree)

[Python] 백준 2357 : 최솟값과 최댓값 (세그먼트 트리)

1. 데이터 스트림의 K번째 가장 큰 요소 찾기#### 상황실시간으로 데이터가 들어오는 상황에서, 언제든지 현재까지 입력된 데이터 중 K번째로 큰 요소를 찾아야 하는 경우입니다. 예를 들어, 온라인 게임에서 플레이어의 점수가 계속 업데이트되고, 플레이어 중 상위 K명의 점수를 실시간으로 모니터링하는 경우에 적용할 수 있습니다.

코드```pythonimport heapq

class KthLargest: def init(self, k, nums): self.heap = nums self.k = k heapq.heapify(self.heap) while len(self.heap) > k: heapq.heappop(self.heap) def add(self, val): heapq.heappush(self.heap, val) if len(self.heap) > self.k: heapq.heappop(self.heap) return self.heap[0]

초기 데이터와 K 설정k = 3nums = [4, 5, 8, 2]

KthLargest 클래스 인스턴스화kthLargest = KthLargest(k, nums)

새로운 데이터 추가 및 K번째 가장 큰 요소 출력print(kthLargest.add(3)) # 출력: 4print(kthLargest.add(5)) # 출력: 5print(kthLargest.add(10)) # 출력: 5print(kthLargest.add(9)) # 출력: 8print(kthLargest.add(4)) # 출력: 8```

2. 다익스트라 알고리즘#### 상황그래프에서 한 노드에서 다른 노드로 가는 최단 경로를 찾는 경우입니다. 예를 들어, 도로 네트워크에서 한 도시에서 다른 도시로 가는 가장 빠른 경로를 찾는 데 사용할 수 있습니다.

코드```pythonimport heapq

def dijkstra(graph, start): distances = {vertex: float('infinity') for vertex in graph} distances[start] = 0 pq = [(0, start)] while pq: current_distance, current_vertex = heapq.heappop(pq) if current_distance > distances[current_vertex]: continue for neighbor, weight in graph[current_vertex].items(): distance = current_distance + weight if distance < distances[neighbor]: distances[neighbor] = distance heapq.heappush(pq, (distance, neighbor)) return distances

그래프 정의graph = { 'A': {'B': 1, 'C': 4}, 'B': {'A': 1, 'C': 2, 'D': 5}, 'C': {'A': 4, 'B': 2, 'D': 1}, 'D': {'B': 5, 'C': 1}}

시작점에서 다른 모든 점까지의 최단 거리 계산print(dijkstra(graph, 'A')) # 출력: {'A': 0, 'B': 1, 'C': 3, 'D': 4}```

3. 허프만 코딩#### 상황데이터 압축에서 사용되는 허프만 코딩은 문자 빈도에 기반하여 각 문자에 대한 최적의 비트 패턴을 생성합니다. 예를 들어, 텍스트 파일을 압축하는 데 이 알고리즘을 사용할 수 있습니다.

코드```pythonimport heapq

class Node: def init(self, char, freq): self.char = char self.freq = freq self.left = None self.right = None def lt(self, other): return self.freq < other.freq def encode(node, left=True, binString=''): if node is None: return '' if node.char is not None: return {node.char: binString} (l, r) = (node.left, node.right) res = {} res.update(encode(l, True, binString +