오늘은 크리스마스다~~~ 와아아아
크리스마스라고 스터디 팀원분이 크리스마스 선물이라는 알고리즘 문제를 내주셨다 ㅋㅋ
난이도는 높지않아서 한번에 성공은 했다.
import sys
input=sys.stdin.readline
n=int(input())
gifts=[]
for _ in range(n):
nums=list(map(int,input().split()))
if nums[0]==0:
if not gifts:
print(-1)
else:
gifts.sort()
print(gifts.pop())
else:
for i in range(1,nums[0]+1):
gifts.append(nums[i])
그런데 시간이 1476ms만큼 걸려서 충분히 더 최적화 할수있는 방법이 있겠다 생각이들었다.
그래서 알고리즘 분류를 봤더니, 우선순위 큐(힙)을 사용하는 문제였다.
힙을 써본지가 오래되서 다시 문법을 찾아가며 코드를 수정했다.
import sys
import heapq
input=sys.stdin.readline
n=int(input())
gifts=[]
for _ in range(n):
nums=list(map(int,input().split()))
if nums[0]==0:
if gifts:
print(-heapq.heappop(gifts))
else:
print(-1)
else:
for gift in nums[1:]:
heapq.heappush(gifts,-gift)
우선순위 큐는 기본적으로 최소힙 방식으로 구현되어있어 최대를 빠르게 찾으려면 값에 - 를 붙인고 큐에 넣은뒤 뺄때 -를 다시 붙여 빼면된다.
이렇게 수정하니 정말 시간이 1/10 정도로 단축되었다..ㄷㄷ 힙의 힘!
힙 자료구조를 사용하는 경우
힙은 최대값이나 최소값을 효율적으로 유지하고 싶을 때 가장 적합합니다. heapq는 파이썬에서 최소 힙으로 구현되어 있으며, 최대값을 유지하려면 값을 음수로 변환하는 방식으로 활용합니다.
활용 사례
우선순위 큐: 작업의 우선순위를 관리해야 할 때.
예: CPU 작업 스케줄링, 네트워크 패킷 처리.
가장 높은 우선순위의 작업을 빠르게 찾고 처리할 수 있음.
K번째 최댓값/최솟값 찾기:
예: 데이터 분석에서 상위 K개 점수만 추출할 때.
힙의 크기를 제한하여 효율적으로 관리.
다익스트라 알고리즘:
그래프에서 최단 경로를 계산할 때 우선순위 큐로 활용.
예: 지도 앱에서 최단 거리 찾기.
실시간 스트림 데이터 처리:
예: 실시간 데이터 스트림에서 중간값(Median)을 계산할 때.
최대 힙과 최소 힙을 활용하여 효율적으로 중간값 유지.
스케줄 관리:
예: 우선순위에 따라 작업을 정렬하여 진행해야 하는 상황.
일정이 겹치지 않도록 조율하거나, 가장 빠른 일정만 유지.
힙 자료구조와 관련된 백준 문제들은 우선순위 큐, 최대/최소값 처리, 데이터 정렬과 관련이 있습니다. 아래는 추천 문제 리스트입니다:
11279 - 최대 힙
heapq를 활용하여 최대 힙을 구현하는 문제입니다.11286 - 절댓값 힙
1927 - 최소 힙
2075 - N번째 큰 수
heapq를 사용하여 N번째 큰 값을 효율적으로 찾아야 합니다.13549 - 숨바꼭질 3
1781 - 컵라면
1655 - 가운데를 말해요
7662 - 이중 우선순위 큐
1202 - 보석 도둑
13975 - 파일 합치기 3
1927, 11279, 11286과 같은 기본 문제로 시작하세요.1655, 1781, 2075를 풀어보며 힙의 응용을 연습하세요.7662, 13549, 1202 같은 문제는 복합적인 알고리즘을 요구하므로 도전해보세요.gpt가 추천해준 힙 연습 문제들도 틈틈히 공부해봐야겠다!