반응형
https://www.acmicpc.net/problem/11286
11286번: 절댓값 힙
첫째 줄에 연산의 개수 N(1≤N≤100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 0이 아니라면 배열에 x라는 값을 넣는(추가하는) 연산이고, x가 0
www.acmicpc.net
문제 정리 : 힙에 입력받고, 0이면 절댓값 중 최소값 출력, 최소값이 2개 이상이면 더 작은 값(음수) 출력, 배열에 아무것도 없으면 0 출력
import heapq
import sys
h = [] # 힙 생성
d = {} # 딕셔너리 생성
n = int(sys.stdin.readline())
for i in range(n):
a = int(sys.stdin.readline()) # 입력값 받기
if a == 0: # 0일 경우
if len(h) == 0: # 배열에 아무것도 없을 때
print(0) # 0출력
else:
result = heapq.heappop(h) # 절대값 최솟값 pop
if result*-1 in d: # 음수인 값이 존재할 경우
print(result*-1) # 정답 출력
if d[result*-1] == 1: # 개수가 0이 되서 삭제 되는 경우
del d[result*-1] # 딕셔너리에서 제거
else:
d[result*-1] = d[result*-1]-1
else: # 음수인 값이 없는 경우
print(result)
if d[result] == 1: #개수가 0이 되는 경우
del d[result]
else:
d[result] = d[result]-1 #딕셔너리에서 제거
else: # 0이 아닐 때
if a not in d: # 최초 입력값일 때
d[a] = 1
else: # 중복될 때
d[a] = d[a] +1 # 개수 추가
heapq.heappush(h, abs(a)) # 힙에 절대값 입력
부호를 구분하기 위해 딕셔너리 생성한다. (리스트도 가능하지만 시간초과 발생)
힙을 통해 절대값 중 최솟값을 구분해 낼 수 있다.
중복되는 값이 입력 될수 있으므로 딕셔너리의 value값으로 key값의 개수로 한다.
value값을 1씩 줄이다가 0이되면 삭제함으로서 중복되는 경우를 고려할 수 있다.
반응형
'알고리즘 > 백준 문제풀이' 카테고리의 다른 글
[백준] 17298번 : 오큰수 (python 파이썬) (0) | 2022.03.16 |
---|---|
[백준] 1158번 : 요세푸스 문제 (python 파이썬) (0) | 2022.03.12 |
[백준] 1406번 : 에디터 (python 파이썬) (0) | 2022.03.12 |
[백준] 1929번 : 소수 구하기 (python 파이썬) [에라토스테네스의 체] (1) | 2022.03.10 |
[백준] 1927번 : 최소힙 (python 파이썬) (0) | 2022.03.10 |