πŸ’» Algorithm/Python

[Python] λ°±μ€€ 11286 μ ˆλŒ“κ°’ νž™ (Heapq)

μ„ μ£Ό 2022. 7. 8. 19:19

πŸ“Œ 문제

μ ˆλŒ“κ°’ νž™μ€ λ‹€μŒκ³Ό 같은 연산을 μ§€μ›ν•˜λŠ” μžλ£Œκ΅¬μ‘°μ΄λ‹€.

 

배열에 μ •μˆ˜ x (x ≠ 0)λ₯Ό λ„£λŠ”λ‹€.
λ°°μ—΄μ—μ„œ μ ˆλŒ“κ°’μ΄ κ°€μž₯ μž‘μ€ 값을 좜λ ₯ν•˜κ³ , κ·Έ 값을 λ°°μ—΄μ—μ„œ μ œκ±°ν•œλ‹€. μ ˆλŒ“κ°’μ΄ κ°€μž₯ μž‘μ€ 값이 μ—¬λŸ¬κ°œμΌ λ•ŒλŠ”, κ°€μž₯ μž‘μ€ 수λ₯Ό 좜λ ₯ν•˜κ³ , κ·Έ 값을 λ°°μ—΄μ—μ„œ μ œκ±°ν•œλ‹€.
ν”„λ‘œκ·Έλž¨μ€ μ²˜μŒμ— λΉ„μ–΄μžˆλŠ” λ°°μ—΄μ—μ„œ μ‹œμž‘ν•˜κ²Œ λœλ‹€.

μž…λ ₯

첫째 쀄에 μ—°μ‚°μ˜ 개수 N(1≤N≤100,000)이 μ£Όμ–΄μ§„λ‹€. λ‹€μŒ N개의 μ€„μ—λŠ” 연산에 λŒ€ν•œ 정보λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ •μˆ˜ xκ°€ μ£Όμ–΄μ§„λ‹€. λ§Œμ•½ xκ°€ 0이 μ•„λ‹ˆλΌλ©΄ 배열에 xλΌλŠ” 값을 λ„£λŠ”(μΆ”κ°€ν•˜λŠ”) 연산이고, xκ°€ 0이라면 λ°°μ—΄μ—μ„œ μ ˆλŒ“κ°’μ΄ κ°€μž₯ μž‘μ€ 값을 좜λ ₯ν•˜κ³  κ·Έ 값을 λ°°μ—΄μ—μ„œ μ œκ±°ν•˜λŠ” κ²½μš°μ΄λ‹€. μž…λ ₯λ˜λŠ” μ •μˆ˜λŠ” -231보닀 크고, 231보닀 μž‘λ‹€.

좜λ ₯

μž…λ ₯μ—μ„œ 0이 μ£Όμ–΄μ§„ 회수만큼 닡을 좜λ ₯ν•œλ‹€. λ§Œμ•½ 배열이 λΉ„μ–΄ μžˆλŠ” 경우인데 μ ˆλŒ“κ°’μ΄ κ°€μž₯ μž‘μ€ 값을 좜λ ₯ν•˜λΌκ³  ν•œ κ²½μš°μ—λŠ” 0을 좜λ ₯ν•˜λ©΄ λœλ‹€.

예제 μž…λ ₯ 1

18
1
-1
0
0
0
1
1
-1
-1
2
-2
0
0
0
0
0
0
0

예제 좜λ ₯ 1

-1
1
0
-1
-1
1
1
-2
2
0

 


πŸ“Œ 풀이

πŸ’¬ Code

import sys, heapq
input = sys.stdin.readline

h = []

for i in range(int(input())):
    x = int(input())
    if x != 0:
        heapq.heappush(h, (abs(x), x))
    else:
        if not h:
            print(0)
        else:
            print(heapq.heappop(h)[1])

 

πŸ’‘ Solution

heapq에 νŠœν”Œμ„ μ‚½μž…ν•˜λ©΄ νŠœν”Œ 첫번째 μ›μ†Œλ₯Ό κΈ°μ€€μœΌλ‘œ μ •λ ¬λ©λ‹ˆλ‹€. 이 λ¬Έμ œλŠ” μ ˆλŒ“κ°’μ„ κΈ°μ€€μœΌλ‘œ μ˜€λ¦„μ°¨μˆœ 정렬을 ν•΄μ€˜μ•Ό ν•˜λ―€λ‘œ νŠœν”Œμ„ μ΄μš©ν–ˆμŠ΅λ‹ˆλ‹€. (abs(x), x)둜 μ ˆλŒ“κ°’κ³Ό 본래 값을 λ¬Άμ–΄μ„œ heapq에 λ„£μ–΄μ£Όκ³ , popν•  λ•ŒλŠ” heapq.heappop(h)[1]둜 본래 κ°’λ§Œ 좜λ ₯ν•΄μ£Όλ©΄ λ©λ‹ˆλ‹€.