<문제>

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

 

 

<풀이>

import sys
import heapq

input = sys.stdin.readline
N = int(input())
heap = []
m_dict = {}

for _ in range(N):
    x = int(input())

    if x != 0: # push
        if x > 0: # x가 양수일 경우
            heapq.heappush(heap, x)
        else: # x가 음수일 경우
            heapq.heappush(heap, -x)
            if -x in m_dict:
                m_dict[-x] += 1
            else:
                m_dict[-x] = 1
    else: # pop
        if len(heap) == 0: # 배열이 비어있는 경우
            print(0)
        else: # 비어있지 않은 경우
            min = heapq.heappop(heap)
            if min in m_dict: # 미리 저장해둔 마이너스 딕셔너리에 min값에 해당하는 값이 존재하면
                print(-min)
                m_dict[min] -= 1
                if m_dict[min] == 0: # 하나 뽑아서 마이너스 딕셔너리에 해당 키의 값이 0이 되었을때
                    del m_dict[min]
            else: 
                print(min)

 

- 절댓값이라는 조건 때문에 자료구조를 2개 써야 하는 문제

- 위 풀이는 최소힙 + 딕셔너리

- 최소힙에는 양수 정수만 저장해놓고, 딕셔너리에 마이너스로 저장한 값들의 갯수를 모아둔다

- 음수를 저장해야 하는 경우 딕셔너리에 해당 음수의 절댓값을 키로, 값을 +1 해준다

- x = 0에 의해 반대로 숫자들을 뽑아낼 때는 딕셔너리를 검사해서 해당 숫자로 카운트된 적이 있는지 살핀다

- 카운트된 적이 있다면 음수로 변환해주고 딕셔너리에서 -1 해주는데

- 0보다 작아진 값이 카운트값에 들어갈 수 있으니까 0이 되면 아예 delete 해준다

 

 

<다른 풀이>

import sys
# sys.stdin = open('data.txt', 'r')
input = sys.stdin.readline
from heapq import heappop, heappush


def main():
    
    plus_heap = []
    minus_heap = []
    _, *nums = map(int, sys.stdin.buffer.read().split())
    
    for x in nums:
        if x > 0:
            heappush(plus_heap, x)
        elif x < 0:
            heappush(minus_heap, -x)
        else:
            if plus_heap and minus_heap:
                if plus_heap[0] >= minus_heap[0]:
                    temp = -heappop(minus_heap)
                else:
                    temp = heappop(plus_heap)
            elif plus_heap:
                temp = heappop(plus_heap)
            elif minus_heap:
                temp = -heappop(minus_heap)
            else:
                temp = 0
            sys.stdout.write(str(temp) + '\n')


if __name__ == '__main__':
    main()

 

- 최소힙 2개를 쓴 풀이

- 최소힙이지만 음수, 양수를 각각 다른 곳에 저장해두어서 첫번째 값(가장 작은 값)끼리 비교

- 반환할 값을 temp로 저장해놓고 마지막에 반환하는 것도 괜찮아 보인다

'TIL > [파이썬] 1일 1코테' 카테고리의 다른 글

파일 정리_백준20291  (0) 2025.02.17
회전초밥_백준28107  (0) 2025.02.15
크리스마스 선물_백준14235  (0) 2025.02.12
RelativeRanks_LeetCode  (0) 2025.02.11
더 맵게_프로그래머스  (1) 2025.02.10

+ Recent posts