728x90
SMALL
우선순위 큐란?
- 우선순위 큐는 데이터들이 우선순위에 따라 처리되는 자료구조입니다. 각 요소는 우선순위 값과 함께 저장되며, 우선순위 값에 따라 요소들이 정렬됩니다. 일반적으로 작은 값이 높은 우선순위를 가지게 됩니다.
- 우선순위 큐를 사용하면 데이터를 삽입하거나 삭제할 때 항상 가장 우선순위가 높은(또는 낮은) 요소를 빠르게 접근할 수 있습니다. 이러한 특성으로 인해 다양한 문제에서 유용하게 활용됩니다.
- 일반적으로 파이썬에서는 heapq 모듈을 활용하여 간편하게 우선순위 큐를 구현할 수 있습니다. heapq 모듈은 최소 힙(min heap)의 형태로 구현되어 있으며, 최대 힙(max heap)을 구현하기 위해서는 값을 음수로 변환하여 활용하는 방법도 있습니다.
코딩 테스트에서의 우선순위 큐 문제 접근 방법
- 우선순위 큐 문제를 해결하기 위한 접근 방법은 다음과 같습니다.
- 필요한 라이브러리/자료구조 선택: 파이썬에서는 heapq 모듈을 활용하여 간편하게 우선순위 큐를 구현할 수 있습니다. 다른 언어에서도 해당 언어의 기본 제공 라이브러리나 직접 구현할 수 있는 자료구조를 활용합니다.
- 데이터 추가 및 삭제: 우선 순위 큐에 데이터를 추가하거나 삭제하는 연산을 수행합니다. 데이터 추가 시, 해당 데이터의 우선 순위 값을 기준으로 정렬됩니다.
- 필요한 연산 수행: 문제의 요구사항에 맞추어 필요한 연산(예: 최솟값/최댓값 추출, 변경 등)을 수행합니다.
- 결과 확인: 문제에서 요구하는 결과를 확인하기 위해 필요한 추가적인 작업을 수행합니다.
2075번: N번째 큰 수
첫째 줄에 N(1 ≤ N ≤ 1,500)이 주어진다. 다음 N개의 줄에는 각 줄마다 N개의 수가 주어진다. 표에 적힌 수는 -10억보다 크거나 같고, 10억보다 작거나 같은 정수이다.
www.acmicpc.net
문제
- N×N의 표에 수 N2개 채워져 있다. 채워진 수에는 한 가지 특징이 있는데, 모든 수는 자신의 한 칸 위에 있는 수보다 크다는 것이다. N=5일 때의 예를 보자.

- 이러한 표가 주어졌을 때, N번째 큰 수를 찾는 프로그램을 작성하시오. 표에 채워진 수는 모두 다르다.
해결 방법
- 이 문제는 주어진 2차원 배열에서 N번째로 큰 값을 찾는 것이 목표입니다.
import heapq
import sys; input=sys.stdin.readline
n = int(input())
heap = []
for _ in range(n):
nums = list(map(int, input().split()))
if not heap:
for num in nums:
heapq.heappush(heap, num)
else:
for num in nums:
if heap[0] < num:
heapq.heappop(heap)
heapq.heappush(heap, num)
while len(heap) > n: heapq.heappop(heap)
print(heap[0])
- 각 줄마다 숫자들을 읽어올 때마다 우선순위 큐에 추가하고, 만약 우선순위 큐의 사이즈가 N보다 커지면 가장 작은 값(우선순위 큐의 root 노드)을 제거합니다. 이렇게 하면 항상 우선순위 큐에는 입력된 숫자들 중에서 가장 큰 N개의 숫자만 남게 됩니다.
- 모든 숫자를 처리한 후에도 만약 우선순위 큐의 사이즈가 N보다 많으면 계속해서 가장 작은 값을 제거하고, 결국 남아있는 값 중에서 가장 작은 값이 바로 전체 입력 중에서 N번째로 큰 수가 됩니다.
1655번: 가운데를 말해요
첫째 줄에는 백준이가 외치는 정수의 개수 N이 주어진다. N은 1보다 크거나 같고, 100,000보다 작거나 같은 자연수이다. 그 다음 N줄에 걸쳐서 백준이가 외치는 정수가 차례대로 주어진다. 정수는 -1
www.acmicpc.net
문제
- 백준이는 동생에게 "가운데를 말해요" 게임을 가르쳐주고 있다. 백준이가 정수를 하나씩 외칠때마다 동생은 지금까지 백준이가 말한 수 중에서 중간값을 말해야 한다. 만약, 그동안 백준이가 외친 수의 개수가 짝수개라면 중간에 있는 두 수 중에서 작은 수를 말해야 한다.
- 예를 들어 백준이가 동생에게 1, 5, 2, 10, -99, 7, 5를 순서대로 외쳤다고 하면, 동생은 1, 1, 2, 2, 2, 2, 5를 차례대로 말해야 한다. 백준이가 외치는 수가 주어졌을 때, 동생이 말해야 하는 수를 구하는 프로그램을 작성하시오.
해결 방법
- 이 문제는 수열의 중간값을 찾는 문제로, 입력되는 숫자들을 하나씩 처리하면서 중간값을 구하는 방식으로 풀이합니다.
import heapq
import sys; input=sys.stdin.readline
n = int(input())
max_heap = []
min_heap = []
for _ in range(n):
num = int(input())
if len(max_heap) == len(min_heap):
heapq.heappush(max_heap, -num)
else:
heapq.heappush(min_heap, num)
if min_heap and max_heap[0] * -1 > min_heap[0]:
temp_max = heapq.heappop(max_heap) * -1
temp_min = heapq.heappop(min_heap)
heapq.heappush(max_heap, -temp_min)
heapq.heappush(min_heap, temp_max)
print(max_heap[0] * -1)
- 위 코드에서 maxheap과 minheap 두 개의 우선순위 큐를 사용합니다. maxheap은 입력된 숫자들 중에서 작거나 같은 값을 저장하며, minheap은 입력된 숫자들 중에서 큰 값을 저장합니다. 이렇게 하면 각각의 우선순위 큐에서 가장 위에 있는 값이 항상 현재까지 입력된 숫자들의 중간값이 됩니다.
- 각 숫자가 입력될 때마다 두 우선순위 큐를 조정하여 항상 maxheap의 최대값이 minheap의 최소값보다 작거나 같도록 유지하고, 그 결과를 출력합니다.
- 우선순위 큐 문제를 해결하기 위해서는 문제의 조건과 요구사항을 명확히 이해하고, 필요한 연산을 구현하는 것이 중요합니다. 문제에서 요구하는 결과를 얻기 위해 필요한 추가 작업이 있다면 그에 맞게 코드를 작성해야 합니다.
728x90
LIST
'알고리즘 이론 > 코딩테스트 알고리즘' 카테고리의 다른 글
| 알면 도움되는 코딩 테스트 유형: 12) #Primality_Test (3) | 2023.09.12 |
|---|---|
| 알면 도움되는 코딩 테스트 유형: 11) #Two_Pointer (0) | 2023.09.10 |
| 알면 도움되는 코딩 테스트 유형: 9) #Divide_and_Conquer (0) | 2023.09.07 |
| 🌱 알면 도움되는 코딩 테스트 유형: 8) #Disjoint_Set (3) | 2023.09.06 |
| 알면 도움되는 코딩 테스트 유형: 7) #Backtracking (2) | 2023.09.05 |