Python3/백준 알고리즘

2022.02.17 [백준] (python 파이썬) 이중 우선순위 큐

ian's coding 2022. 2. 17. 21:34
728x90
반응형

 

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

 

7662번: 이중 우선순위 큐

입력 데이터는 표준입력을 사용한다. 입력은 T개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에는 입력 데이터의 수를 나타내는 정수 T가 주어진다. 각 테스트 데이터의 첫째 줄에는 Q에 적

www.acmicpc.net


풀이

https://neomindstd.github.io/%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4/boj7662/

 

[백준/파이썬] 7662번 이중 우선순위 큐 풀이

파이썬을 이용한 백준 온라인저지 문제풀이

neomindstd.github.io

이 문제는 위의 블로그의 설명을 보며 이해하고 풀었습니다.

 

이 문제는 최대힙과 최소힙 2개를 사용했다. 단순히 두개만 사용하면 데이터 동기화가 되지 않아 마지막엔 엉뚱한 값이 출력된다. 그래서 두 힙을 동기화 시키기 위해 for문의 순서를 각 힙에 식별자로 넣었다. 그래서 I로 힙에 넣을 땐 visited[i]를 True로 바꿔주었다. D가 입력 됬을 때, while문을 통해 각 힙에 False로되어있는 데이터는 이미 삭제 된 데이터이므로 삭제되지않은 데이터가 나올때까지 데이터를 버려준다. 

그 다음 배열이 비어있으면 넘어가고 비어있지않으면 해당 식별자의 visited를 False로 바꾼뒤 루트노드를 버려준다.

모든 입력을 다 받고 난 후 역시 각 힙에 false로 되어있는 값들을 모두 버려준다.

이 후, 각 힙에 데이터가 들어있지않으면 EMPTY를 출력하고 들어있으면 각 힙의 0번째 인덱스를 출력해준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import heapq
import sys
 
input=sys.stdin.readline
 
for _ in range(int(input())):
    min=[]
    max=[]
    visited=[False]*1_000_001
    for i in range(int(input())):
        s=input().split()
        alpha=s[0]
        num=int(s[1])
        if alpha=='I':
            heapq.heappush(min,(num,i))
            heapq.heappush(max,(-num,i))
            visited[i]=True
        elif num==1:
            while max and not visited[max[0][1]]:heapq.heappop(max)
            if max:
                visited[max[0][1]]=False
                heapq.heappop(max)
        else:
            while min and not visited[min[0][1]]:heapq.heappop(min)
            if min:
                visited[min[0][1]]=False
                heapq.heappop(min)
    while max and not visited[max[0][1]]:heapq.heappop(max)
    while min and not visited[min[0][1]]:heapq.heappop(min)
    if max and min:
        print(-max[0][0], min[0][0],sep=' ')
    else:
        print('EMPTY')
 
 
cs

 

 

 

 

728x90
반응형