[λ°±μ€€] 11286 μ ˆλŒ“κ°’ νž™ - μš°μ„ μˆœμœ„ 큐, νž™

2024. 10. 4. 17:58Β·πŸ’» Algorithms/λ°±μ€€

[ 문제링크 ]

https://www.acmicpc.net/problem/11286

 

🚩 쑰건

  1. μ—°μ‚°μ˜ 개수 N(1≤N≤100,000)이 μ£Όμ–΄μ§€λ©΄, λ‹€μŒ N개의 쀄에 연산에 λŒ€ν•œ 정보λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ •μˆ˜ xκ°€ 주어짐.
  2. xκ°€ 0이 μ•„λ‹ˆλΌλ©΄ 배열에 xλΌλŠ” 값을 λ„£λŠ” μ—°μ‚°μž„
  3. xκ°€ 0이라면 λ°°μ—΄μ—μ„œ μ ˆλŒ“κ°’μ΄ κ°€μž₯ μž‘μ€ 값을 좜λ ₯ν•˜κ³  κ·Έ 값을 λ°°μ—΄μ—μ„œ μ œκ±°ν•˜λŠ” μ—°μ‚°μž„
  4. μž…λ ₯λ˜λŠ” xλŠ” -2^31보닀 크고, 2^31보닀 μž‘μŒ
  5. μž…λ ₯μ—μ„œ 0이 μ£Όμ–΄μ§„ 횟수만큼 닡을 좜λ ₯해라. 배열이 λΉ„μ–΄μžˆλŠ”λ° 0이 μž…λ ₯되면 0을 좜λ ₯해라.

 

 

🚩 μ ‘κ·Ό

μš°μ„ μˆœμœ„ 큐λ₯Ό μ‚¬μš©ν•˜κ³  μ ˆλŒ“κ°’μ„ μš°μ„ μˆœμœ„λ‘œ 두면 λ˜μ§€ μ•Šμ„κΉŒ?

 

 

🚩 μ‹œν–‰μ°©μ˜€

- μš°μ„ μˆœμœ„ 큐 κ΅¬ν˜„

μš°μ„ μˆœμœ„ νλŠ” νž™μ΄λΌλŠ” 자료ꡬ쑰λ₯Ό 톡해 κ΅¬ν˜„ν•  수 μžˆλ‹€.

νž™μ€ μ™„μ „ 이진 트리 λͺ¨μ–‘을 κ°€μ§€λ©°, λΆ€λͺ¨ λ…Έλ“œμ˜ 값이 항상 μžμ‹ λ…Έλ“œλ“€μ˜ 값보닀 ν¬κ±°λ‚˜(=>max heap) μž‘λ‹€(=>min heap). λ”°λΌμ„œ νž™μ€ λ£¨νŠΈλ…Έλ“œμ— μš°μ„ μˆœμœ„κ°€ κ°€μž₯ 높은 데이터λ₯Ό μœ„μΉ˜μ‹œν‚¨λ‹€. νž™ μžλ£Œκ΅¬μ‘°λŠ” μš°μ„ μˆœμœ„ 큐λ₯Ό κ΅¬ν˜„ν•˜κ±°λ‚˜, νž™ 정렬을 ν•˜λŠ” 데 μ‚¬μš©λœλ‹€.

[좜처] https://chanhuiseok.github.io/posts/ds-4/

 

βž• μ™œ μš°μ„ μˆœμœ„ νλŠ” λ°°μ—΄μ΄λ‚˜ μ—°κ²°λ¦¬μŠ€νŠΈκ°€ μ•„λ‹Œ, νž™μœΌλ‘œ κ΅¬ν˜„ν• κΉŒ?

  1. λ°°μ—΄λ‘œ κ΅¬ν˜„ν•œλ‹€λ©΄
    • μš°μ„ μˆœμœ„κ°€ 쀑간인 것이 λ“€μ–΄κ°€μ•Ό ν•  λ•Œ, λ’€μ˜ 데이터 λͺ¨λ‘ ν•œ μΉΈμ”© λ’€λ‘œ λ°€μ–΄μ•Ό 함. μ΅œμ•…μ˜ 경우 λͺ¨λ“  데이터λ₯Ό λ’€λ‘œ λ°€μ–΄μ•Ό 함.
    • λ”°λΌμ„œ μ‚­μ œ : O(1), μ‚½μž… : O(n)
  2. μ—°κ²°λ¦¬μŠ€νŠΈλ‘œ κ΅¬ν˜„ν•œλ‹€λ©΄
    • μš°μ„ μˆœμœ„κ°€ 쀑간인 것이 λ“€μ–΄κ°€μ•Ό ν•  λ•Œ, κ·Έ μœ„μΉ˜λ₯Ό μ°Ύμ•„μ•Ό 함. μ΅œμ•…μ˜ 경우 맨 λκΉŒμ§€ 탐색해야 함.
    • λ”°λΌμ„œ μ‚­μ œ : O(1), μ‚½μž… : O(n)
  3. νž™μœΌλ‘œ κ΅¬ν˜„ν•œλ‹€λ©΄
    • μ‚½μž… : 맨 끝 μœ„μΉ˜μ— λ„£κ³  μ΅œμ†Œ/μ΅œλŒ€ νž™μ˜ 쑰건 μœ„λ°°λ˜λ©΄ 두 λ…Έλ“œμ˜ 자리 λ°”κΏ”λ‚˜κ°
    • μ‚­μ œ : 일단 트리 ꡬ쑰 μƒμ—μ„œ κ°€μž₯ λ§ˆμ§€λ§‰ μœ„μΉ˜μΈ κ°’κ³Ό 루트λ₯Ό λ°”κΏ”μ„œ 루트λ₯Ό μ•ˆμ „ν•˜κ²Œ 제거, 이후 νž™μ˜ μ„±μ§ˆμ΄ 잘 만쑱될 수 있게 λ‚΄λΆ€μ μœΌλ‘œ μœ„μΉ˜λ₯Ό λ°”κΏˆ
    • λ”°λΌμ„œ μ‚­μ œ : O(log2n), μ‚½μž… : O(log2n)
    • 참고둜 "νž™"을 κ΅¬ν˜„ν•  μ‹œμ—λŠ” 배열을 μ‚¬μš©ν•˜λŠ” 게 μ’‹μŒ

 

pythonμ—μ„œ μš°μ„ μˆœμœ„ νλŠ” PriorityQueue class둜 제곡되고, μ΄λŠ” λ‚΄λΆ€μ μœΌλ‘œ heapq λͺ¨λ“ˆμ„ 톡해 κ΅¬ν˜„λ˜μ–΄ μžˆλ‹€. λ”°λΌμ„œ PriorityQueue, heapq λ‘˜ 쀑 μ•„λ¬΄κ±°λ‚˜ μ‚¬μš©ν•΄λ„ λœλ‹€. (gpt ν”Όμ…œλ‘œ 단일 μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œλŠ” heapq, λ©€ν‹° μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œλŠ” PriorityQueueλ₯Ό μ‚¬μš©ν•˜λŠ” κ±Έ ꢌμž₯ν•œλ‹€κ³  함)

from queue import PriorityQueue

# 생성 (defaultλŠ” μ΅œμ†Œ νž™(=μ˜€λ¦„μ°¨μˆœ μ •λ ¬))
pq = PriorityQueue()

# xλΌλŠ” μ›μ†Œ μ‚½μž…
pq.put(x)

# μ›μ†Œ μ‚­μ œ ν›„ 리턴
pq.get()

## μ΅œλŒ€ νž™ κ΅¬ν˜„ν•˜λ €λ©΄
## μš°μ„ μˆœμœ„λ₯Ό 음수둜 λ³€ν™˜ν•˜μ—¬ μ‚½μž…
## pq.put(-x)
## 리턴 κ°’ μ‚¬μš© μ‹œ λ‹€μ‹œ μ–‘μˆ˜λ‘œ λ³€ν™˜
## print(-pq.get())
import heapq

# 생성 (defaultλŠ” μ΅œμ†Œ νž™(=μ˜€λ¦„μ°¨μˆœ μ •λ ¬))
hq = []

# μ›μ†Œ μ‚½μž… (heap의 ν˜•νƒœλ₯Ό μœ μ§€ν•˜λ©΄μ„œ hq에 xλΌλŠ” μ›μ†Œλ₯Ό push)
heapq.heappush(hq, x)

# μ›μ†Œ μ‚­μ œ ν›„ 리턴 (heap의 ν˜•νƒœλ₯Ό μœ μ§€ν•˜λ©΄μ„œ hqμ—μ„œ 루트 λ…Έλ“œλ₯Ό λ°˜ν™˜)
heapq.heappop(heap)

# 리슀트λ₯Ό μ„ ν˜• μ‹œκ°„λ‚΄μ— heap으둜 λ³€ν™˜
arr = [4, 3, 1, 2]
print(arr) # [4, 3, 1, 2]
heapq.heapify(arr)
print(arr) # [1, 2, 4, 3]

## μ΅œλŒ€ νž™ κ΅¬ν˜„ν•˜λ €λ©΄
## μš°μ„ μˆœμœ„λ₯Ό 음수둜 λ³€ν™˜ν•˜μ—¬ μ‚½μž…
## heapq.heappush(hq, -x)
## 리턴 κ°’ μ‚¬μš© μ‹œ λ‹€μ‹œ μ–‘μˆ˜λ‘œ λ³€ν™˜
## print(-heapq.heappop(hq))

 

- μ‹œκ°„μ΄ˆκ³Ό

python으둜 문제λ₯Ό ν’€ λ•Œ 맨 첫쀄 test case 개수λ₯Ό μž…λ ₯λ°›λŠ” 건 input()을 μ‚¬μš©ν•΄λ„ λ¬΄λ°©ν•˜λ‚˜, 반볡문으둜 μ—¬λŸ¬ 쀄 μž…λ ₯λ°›λŠ” μƒν™©μ—μ„œλŠ” λ°˜λ“œμ‹œ sys.stdin.readline()을 μ‚¬μš©ν•΄μ•Ό μ‹œκ°„μ΄ˆκ³Όκ°€ λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€!

 

 

πŸ’» μ½”λ“œ (Python3)

import heapq
import sys

N = int(input())
heap = []    # μ΅œμ†Œνž™, 각 μ›μ†Œ : (μ ˆλŒ“κ°’, μ‹€μ œκ°’κ°’)
for _ in range(N):
    x = int(sys.stdin.readline())
    if x==0:
        if not heap:
            print(0)
        else:
            min_abs = heapq.heappop(heap)
            print(min_abs[1])
    else:
        heapq.heappush(heap, (abs(x),x))

 

 

μ°Έκ³  )

 

자료ꡬ쑰 - μš°μ„ μˆœμœ„ 큐(Priority Queue)와 νž™(heap)

컴퓨터/IT/μ•Œκ³ λ¦¬μ¦˜ 정리 λΈ”λ‘œκ·Έ

chanhuiseok.github.io

 

heapq — Heap queue algorithm

Source code: Lib/heapq.py This module provides an implementation of the heap queue algorithm, also known as the priority queue algorithm. Heaps are binary trees for which every parent node has a va...

docs.python.org

 

[Python] heapqλ₯Ό μ΄μš©ν•œ μ΅œμ†Œ νž™, μ΅œλŒ€ νž™

heapqλ₯Ό μ΄μš©ν•œ μ΅œμ†Œ νž™κ³Ό μ΅œλŒ€ νž™ κ΅¬ν˜„

velog.io

 

'πŸ’» Algorithms > λ°±μ€€' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[λ°±μ€€] 1676 νŒ©ν† λ¦¬μ–Ό 0의 개수 - μˆ˜ν•™, μ •μˆ˜λ‘   (1) 2024.09.16
[λ°±μ€€] 1929 μ†Œμˆ˜ κ΅¬ν•˜κΈ° - μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체  (0) 2024.09.15
[λ°±μ€€] 12865 ν‰λ²”ν•œ λ°°λ‚­ - λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°  (0) 2024.09.01
[λ°±μ€€] 10844 μ‰¬μš΄ 계단 수 - λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°  (0) 2024.09.01
[λ°±μ€€] 11727 2xn 타일링2 - λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°  (0) 2024.08.31
'πŸ’» Algorithms/λ°±μ€€' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • [λ°±μ€€] 1676 νŒ©ν† λ¦¬μ–Ό 0의 개수 - μˆ˜ν•™, μ •μˆ˜λ‘ 
  • [λ°±μ€€] 1929 μ†Œμˆ˜ κ΅¬ν•˜κΈ° - μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체
  • [λ°±μ€€] 12865 ν‰λ²”ν•œ λ°°λ‚­ - λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°
  • [λ°±μ€€] 10844 μ‰¬μš΄ 계단 수 - λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°
적끄
적끄
  • 적끄
    끄적
    적끄
  • 전체
    였늘
    μ–΄μ œ
    • λΆ„λ₯˜ 전체보기 (30)
      • πŸ’» Algorithms (28)
        • λ°±μ€€ (22)
        • ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ (6)
      • πŸ”Ž Deep Learning (0)
      • πŸ’₯ νŠΈλŸ¬λΈ”μŠˆνŒ… (1)
      • πŸ•Ή Unity (1)
      • πŸ₯” μž‰ν…… (0)
  • λΈ”λ‘œκ·Έ 메뉴

    • ν™ˆ
    • νƒœκ·Έ
    • λ°©λͺ…둝
  • 링크

    • Blog
    • Github
    • Velog
  • 곡지사항

  • 인기 κΈ€

  • νƒœκ·Έ

  • 졜근 λŒ“κΈ€

  • 졜근 κΈ€

  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.0
적끄
[λ°±μ€€] 11286 μ ˆλŒ“κ°’ νž™ - μš°μ„ μˆœμœ„ 큐, νž™
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”