Point ๐Ÿ’ก


์ฒ˜์Œ์„ ์„ค๊ณ„ํ•  ๋•Œ, ์šฐ์„ ์ˆœ์œ„๋ฅผ 1. ๋ฐ๋“œ๋ผ์ธ, 2. ์ปต๋ผ๋ฉด ์ˆ˜๋กœ ์žก๊ณ , ํฐ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌ์„ ํ•œ ๋’ค์— ์นด์šดํŠธ์™€ ๋น„๊ต๋ฅผ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ทจํ–ˆ๋Š”๋ฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ˆ์™ธ๋ฅผ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

4
1 50
2 30
3 60
3 70

# ๋‹ต : 180
# ์ถœ๋ ฅ : 160  

๊ทธ๋ ‡๋‹ค๋ฉด, ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผํ• ๊นŒ?

๋ฐฐ์—ด์„ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•œ ๋’ค, ํ์— ์ผ๋‹จ ์ปต๋ผ๋ฉด ์ˆ˜๋ฅผ ๋‹ค ์ง‘์–ด๋„ฃ๊ณ , ํ์˜ ๊ธธ์ด๋ณด๋‹ค ๋ฐ๋“œ๋ผ์ธ ์ˆซ์ž๊ฐ€ ๋” ์ž‘์œผ๋ฉด, ํ์—์„œ pop์„ ์‹œํ‚จ๋‹ค. ์ด๋•Œ, ์ตœ์†Œํž™์ด๋ฏ€๋กœ pop์„ ์‹œํ‚ค๋ฉด ๊ฐ€์žฅ ์ž‘์€ ์ˆซ์ž๊ฐ€ ๋‚˜์˜ค๋ฏ€๋กœ ์ปต๋ผ๋ฉด ์ˆ˜์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

(1, 50) , len(queue) = 0 -> queue[50]
(2, 30) , len(queue) = 1 -> queue[50, 30]
(3, 60) , len(queue) = 2 -> queue[60, 50, 30]
(3, 70) , len(queue) = 3 -> queue[70, 60, 50, 30], queue.pop() : queue[70, 60, 50]

Priority Queue

: pop์„ ํ•  ๋•Œ ๊ฐ€์žฅ ๋จผ์ € ๋“ค์–ด์˜จ ์›์†Œ๊ฐ€ ๋‚˜์˜ค๋Š” ๋Œ€์‹  ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ์›์†Œ๊ฐ€ ๋‚˜์˜ค๋Š” ํ

๋ฐฐ์—ด, ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ, ํž™ 3๊ฐ€์ง€๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ฐฐ์—ด์ด๋‚˜ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋กœ ๊ตฌํ˜„ํ•  ๊ฒฝ์šฐ, ๋ฐ์ดํ„ฐ ์‚ฝ์ž…๊ณผ ์‚ญ์ œ ๊ณผ์ •์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ์นธ์”ฉ ๋‹น๊ธฐ๊ฑฐ๋‚˜ ๋ฏธ๋Š” ์—ฐ์‚ฐ์„ ๊ณ„์† ํ•ด์•ผํ•œ๋‹ค.

๋˜ํ•œ, ์‚ฝ์ž…์˜ ์œ„์น˜๋ฅผ ์ฐพ๊ธฐ์œ„ํ•ด ๋ฐฐ์—ด์— ์ €์žฅ๋œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ์™€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋น„๊ตํ•ด์•ผํ•œ๋‹ค. ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์˜ ๊ฒฝ์šฐ, ์‚ฝ์ž…์˜ ์œ„์น˜๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ์ฒซ๋ฒˆ์งธ ๋…ธ๋“œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ์™€ ์šฐ์„ ์ˆœ์œ„ ๋น„๊ต๋ฅผ ์ง„ํ–‰ํ•ด์•ผํ•  ์ˆ˜๋„ ์žˆ๋‹ค โ†’ ์„ฑ๋Šฅ์ €ํ•˜

๋”ฐ๋ผ์„œ, ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํž™์œผ๋กœ ๊ตฌ์„ฑํ•œ๋‹ค.

import heapq

# ์ตœ์†Œํž™ ๊ตฌํ˜„ (default)
heap = []

# [1, 2, 3, 4, 5]
for i in range(1, 6):
		heapq.heappush(heap, i)

# ์ž‘์€ ์ˆซ์ž ์ˆœ์„œ๋Œ€๋กœ 1, 2, 3, 4, 5 ์ถœ๋ ฅ
for i in range(5):
		print(heapq.heappop(heap))

####

# ์ตœ๋Œ€ํž™ ๊ตฌํ˜„
heap = []
values= [1, 5, 3, 2, 4]

# [-5, -4, -3, -2, -1]
for value in values:
		heapq.heappush(heap, -value)

# ํฐ ์ˆซ์ž ์ˆœ์„œ๋Œ€๋กœ 5, 4, 3, 2, 1 ์ถœ๋ ฅ
for i in range(5):
		print(-heapq.heappop(heap))

import java.util.PriorityQueue;
import java.util.Collections;

// ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‚ฎ์€ ์ˆซ์ž์ธ intํ˜• ์šฐ์„ ์ˆœ์œ„ํ (์ตœ์†Œํž™)
PriorityQueue<Integer> priorityQueue1 = new PriorityQueue<>();

// ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ์ˆซ์ž์ธ intํ˜• ์šฐ์„ ์ˆœ์œ„ํ (์ตœ๋Œ€ํž™)
PriorityQueue<Integer> priorityQueue2 = new PriorityQueue<>(Collections.reverseOrder());

priorityQueue1.add(1);
priorityQueue1.offer(20);

// ์ฒซ๋ฒˆ์งธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , ์ œ๊ฑฐ + ๋น„์–ด์žˆ๋‹ค๋ฉด null ๋ฐ˜ํ™˜
priorityQueue1.poll();

// ์ฒซ๋ฒˆ์งธ ๊ฐ’ ์ œ๊ฑฐ + ๋น„์–ด์žˆ๋‹ค๋ฉด ์˜ˆ์™ธ ๋ฐœ์ƒ
priorityQueue1.remove();

// ์ฒซ๋ฒˆ์งธ ๊ฐ’์„ ๋ฐ˜ํ™˜๋งŒ ํ•˜๊ณ , ์ œ๊ฑฐ X + ๋น„์–ด์žˆ๋‹ค๋ฉด null ๋ฐ˜ํ™˜
priorityQueue1.peek();

// ์ฒซ๋ฒˆ์งธ ๊ฐ’์„ ๋ฐ˜ํ™˜๋งŒ ํ•˜๊ณ , ์ œ๊ฑฐ X + ๋น„์–ด์žˆ๋‹ค๋ฉด ์˜ˆ์™ธ ๋ฐœ์ƒ
priorityQueue1.element();

// ์ดˆ๊ธฐํ™”
priorityQueue1.clear();