땅지원
땅지원's Personal blog
땅지원
전체 방문자
오늘
어제
  • 전체 (353)
    • Frontend (2)
      • React (2)
    • Backend (90)
      • Java (16)
      • Python (19)
      • Spring (23)
      • Database (21)
      • Troubleshooting (8)
    • DevOps (27)
      • ELK (13)
    • CS (40)
    • OS (2)
      • Linux (2)
    • Algorithm (95)
      • concept (18)
      • Algorithm Problem (77)
    • 인공지능 (25)
      • 인공지능 (12)
      • 연구노트 (13)
    • 수업정리 (35)
      • 임베디드 시스템 (10)
      • 데이터통신 (17)
      • Linux (8)
    • 한국정보통신학회 (5)
      • 학술대회 (4)
      • 논문지 (1)
    • 수상기록 (8)
      • 수상기록 (6)
      • 특허 (2)
    • 삼성 청년 SW 아카데미 (6)
    • 42seoul (12)
    • Toy project (3)
    • 땅's 낙서장 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • 20.11.6 BB21플러스 온라인 학술대회
  • 20.10.30 한국정보통신학회 온라인 학술대회

인기 글

태그

  • D
  • 이것이 리눅스다 with Rocky Linux9
  • ㅗ
  • E
  • I

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
땅지원

땅지원's Personal blog

Algorithm/Algorithm Problem

백준 7662 이중 우선순위 큐(Heapq)

2022. 5. 12. 14:50

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

 

7662번: 이중 우선순위 큐

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

www.acmicpc.net

문제는 간단하게 데이터를 삽입하고 최대값, 최소값을 삭제 해주면서 데이터를 관리하는 작업이였다.

 

list를 선언하고 list.index, list.remove 등 list 연산을 쓰면 무조껀 시간초과가 나기때문에

최소힙, 최대힙을 사용하여 최소, 최댓값에 대한 처리를 해야겠다고 생각했다.

 

여기서 유의할점은 단순히 우선순위큐 모듈인 PriorityQueue()을 사용하려고 했지만 최소, 최대를 모두 고려해줘야 하기 때문에 최소힙, 최대힙 2개의 힙을 구현한다음 최소힙에서 빼준 값을 최대힙에서도 빼줘야하기 때문에 tuple 형태로 idx값을 같이 저장해서 한쪽힙에서 삭제 연산이 일어났으면 visited 방문처리를 해줘서 나머지 힙에서도 처리를 하게했다.

 

import heapq
import sys
input = sys.stdin.readline

t = int(input())
for _ in range(t):
    k = int(input())
    max_heapq = []
    min_heapq = []
    visited = [0] * k
    for i in range(k):
        command, num = input().split()

        if command == 'I':
            heapq.heappush(min_heapq,(int(num),i))
            heapq.heappush(max_heapq,(-1 * int(num),i))
        else:
            if num == '1':
                while max_heapq:
                    if visited[max_heapq[0][1]] == 1:
                        heapq.heappop(max_heapq)
                    else:
                        break
                if max_heapq:
                    visited[max_heapq[0][1]] = 1
                    heapq.heappop(max_heapq)

            elif num == '-1':
                while min_heapq:
                    if visited[min_heapq[0][1]] == 1:
                        heapq.heappop(min_heapq)
                    else:
                        break
                if min_heapq:
                    visited[min_heapq[0][1]] = 1
                    heapq.heappop(min_heapq)

    while max_heapq:
            if visited[max_heapq[0][1]] == 1:
                heapq.heappop(max_heapq)
            else:
                break
    while min_heapq:
            if visited[min_heapq[0][1]] == 1:
                heapq.heappop(min_heapq)
            else:
                break

    if min_heapq and max_heapq:
        print(-max_heapq[0][0], min_heapq[0][0])
    else:
        print('EMPTY')

'Algorithm > Algorithm Problem' 카테고리의 다른 글

백준 13900 순서쌍의 곱의 합(구현)  (0) 2022.05.20
백준 11571 분수를 소수로(구현)  (0) 2022.05.20
백준 16928 뱀과 사다리 게임(BFS)  (0) 2022.05.10
백준 14500 테트로미노(Brute-Force, DFS)  (0) 2022.05.09
백준 9019 DSLR(시간복잡도, BFS)  (0) 2022.05.06
    'Algorithm/Algorithm Problem' 카테고리의 다른 글
    • 백준 13900 순서쌍의 곱의 합(구현)
    • 백준 11571 분수를 소수로(구현)
    • 백준 16928 뱀과 사다리 게임(BFS)
    • 백준 14500 테트로미노(Brute-Force, DFS)
    땅지원
    땅지원
    신입 개발자의 우당탕탕 기술 블로그

    티스토리툴바