11286번: 절댓값 힙
첫째 줄에 연산의 개수 N(1≤N≤100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 0이 아니라면 배열에 x라는 값을 넣는(추가하는) 연산이고, x가 0
www.acmicpc.net
처음에 나는 이문제를 음수와 양수를 나눠서 정리는 방향으로 해결하였다.
하지만 나중에 풀이를 확인하던중 다른 좋은 해결법도 있어서 두가지 방법 모두 정리해보겠다.
#######################################################
import sys
import heapq
#######################################################
n = int(sys.stdin.readline()) # 받아올 정수의 개수
ml = [] # 음수를 저장할
pl = [] # 양수를 저장할
for i in range(n): # n만큼 돌린다.
inp = int(sys.stdin.readline()) # 정수 받기
if inp == 0: # 입력이 0이면 절대값 최소인 정수를 출력하거나 배열이 비어있으면 0출력
if len(ml) == 0 and len(pl) == 0: # 배열이 비어있다면
print(0) # 0출력
elif len(ml) == 0: # 음수 배열이 비어있다면
print(heapq.heappop(pl)) # 양수 배열에서 pop
elif len(pl) == 0: # 양수 배열이 비어있다면
print(-(heapq.heappop(ml))) # 음수 배열에서 pop하면서 -를 붙여준다.
else: # 두 배열다 숫자가 있다면
if ml[0] <= pl[0]: # 두 배열을 비교하여
print(-(heapq.heappop(ml))) # 작은 배열에서 출력
elif ml > pl: # 두 배열을 비교하여
print(heapq.heappop(pl)) # 작은 배열에서 출력
elif inp > 0: # 입력값이 양수다
heapq.heappush(pl, inp) # 양수 배열에 push
elif inp < 0: # 입력값이 음수다
heapq.heappush(ml, -(inp)) # 음수를 -곱하고 배열에 정렬되도록 push
두번째 방법은 리스트에 push할 때 (절대값, 정수) 쌍으로 넣어주는 것이다. heap은 한쌍중 앞의 원소로만 정렬을 하기 때문에 자동으로 절대값으로 정렬이 된다.
#######################################################
import sys
import heapq
#######################################################
n = int(sys.stdin.readline()) # 받아올 정수의 개수
ab = []
for i in range(n): # n만큼 돌린다.
inp = int(sys.stdin.readline()) # 정수 받기
if inp != 0: # inp이 0이라면
heapq.heappush(ab, (abs(inp), inp)) # (입력의 절대값, 입력) 쌍으로 heappush를 한다.
else: # inp이 다른 정수라면
if len(ab) == 0: # ab의 길이가 0이면
print(0) # 0출력
else: # ab에 정수가 들어있으면
print(heapq.heappop(ab)[1]) # 정수 출력
'Problem Solving > 백준' 카테고리의 다른 글
백준 [Bronze II] 할리갈리 - 27160 [파이썬, 자료 구조, 해시를 사용한 집합과 맵, 구현, 문자열] (0) | 2023.05.26 |
---|---|
백준 문자열 집합 - 14425 [파이썬, 자료 구조, 해시를 사용한 집합과 맵, 문자열, 트리를 사용한 집합과 맵] (0) | 2023.05.04 |
백준 최대 힙 - 11279 [파이썬, 자료 구조, 우선순위 큐] (0) | 2023.04.22 |
백준 최소 힙 - 1927 [파이썬, 자료 구조, 우선순위 큐] (0) | 2023.04.22 |
백준 1076 저항 [파이썬, 구현] (0) | 2023.03.24 |
댓글