카테고리 없음

[baekjoon] 백준 7662번 : 이중 우선순위 큐 (by python 파이썬) 이중 힙큐

코딩하는이씨 2022. 6. 4. 15:46
728x90
반응형

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

 

7662번: 이중 우선순위 큐

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

www.acmicpc.net

 

정답 code

#이중 우선순위 큐
import heapq
import sys
input = sys.stdin.readline

t = int(input())


for _ in range(t):
    k = int(input())
    q_max, q_min = [], []
    visited = [False]*k

    for i in range(k):
        s, n = input().split()

        if s == 'I':
            heapq.heappush(q_max, (-int(n), i)) #최대 힙 (-를 붙여 제일 큰수를 최소로 만듬)
            heapq.heappush(q_min, (int(n), i)) #최소 힙
            visited[i] = True #정수 생성

        elif s == 'D':
            if n == '1':
                #만약 정수가 없다면(=False) 힙 제거
                while q_max and visited[q_max[0][1]] == False:
                    heapq.heappop(q_max)
                #최대힙 존재시 제거
                if q_max:
                    visited[q_max[0][1]] = False
                    heapq.heappop(q_max)

            else:
                #만약 정수가 없다면(=False) 힙 제거
                while q_min and visited[q_min[0][1]] == False:
                    heapq.heappop(q_min)
                #최소 힙 존재시 제거
                if q_min:
                    visited[q_min[0][1]] = False
                    heapq.heappop(q_min)

    if True not in visited: #정수 없으면 empty출력
        print("EMPTY")
    
    else: #정수가 없다면
        #존재하지 않는 정수(=False)제거
        while q_max and visited[q_max[0][1]] == False:
            heapq.heappop(q_max)
        while q_min and visited[q_min[0][1]] == False:
            heapq.heappop(q_min)
        #최대값(-붙여뒀음으로 다시 -로 +만들기), 최소값 출력
        print(-q_max[0][0], q_min[0][0])

 

solution

처음엔 하나의 힙큐로 문제를 풀어나갔는데 해결하지 못하는 부분이 있었다.

결국 힙큐 두개를 선언해서 풀어야 했는데 두 힙큐를 동기화하기위해 visited를 이용해 동기화 시켜 해결하면된다.

 

I로 입력이 들어오면 q_max  와 q_min에 각각 추가하고 visited[i]도 True 로 바꿔준다.

 

D로 입력이 들어오면 1인경우와 -1인경우를 나눠서 만약 q_max나 q_min에 존재해도 visited가 False로 되어있다면

다른 힙큐에서 삭제 되었음으로 해당 힙큐에서도 지우고 최대값이나 최솟값을 빼내면 된다.

 

모든 과정이 끝나고도 q_max와 q_min을 동기화 시켜주고 최대값과 최솟값을 출력하면 된다.

728x90
반응형