[백준] 7662 이중 우선순위 큐 java

2022. 6. 6. 13:39· Dev/PS

이중 우선순위 큐 구현 문제였다.

 

min-heap 과 max-heap 두개로 구현해볼까 했는데 뭔가 내가 전혀 모르는 방법이 있을 것 같아서 찾아보니 min-max-heap을 구현하는 방법과 c++의 STL 라이브러리에서 Multiset을 이용한 방법 그리고 내가 사용한 TreeMap을 이용한 구현 방법이 있었다. 

 

먼저 나는 다른 알고리즘 문제를 풀면서 Map 자료구조 중에서는 항상 HashMap 만을 사용해왔었다. 

 

TreeMap은 내부가 레드 블랙 트리를 사용하고 있고 삽입, 삭제, 추가 모두 O(log n)의 시간복잡도가 나와서 HashMap 보다는 성능이 떨어진다. 하지만 범위의 검색을 하거나 최댓값, 최솟값을 찾을 때는 TreeMap을 사용하는 것이 효율적이다.

 

처음에는 구현할 때 중복으로 들어오는 값을 생각을 못하고 구현했다가 문제를 잘 보니 중복되는 수가 들어올 수 있다는 문구를 발견했다. 역시 처음에 문제를 볼 때 한번에 정확한 요구사항을 체크하는 습관을 만들어야겠다.

 

import java.io.*;
import java.util.*;

public class Main {
    static BufferedReader br;
    static StringTokenizer st;
    static StringBuilder sb;
    static int T;

    public static void main(String[] args) throws IOException {
        input();
        solve();
        System.out.print(sb.toString());
    }

    static void input() throws IOException {
        br = new BufferedReader(new InputStreamReader(System.in));
        T = Integer.parseInt(br.readLine());
        sb = new StringBuilder();
    }

    static void solve() throws IOException{
        for(int i = 1; i <= T; i++) {
            TreeMap<Long,Integer> q = new TreeMap<>();
            final int N = Integer.parseInt(br.readLine());
            for(int j = 1; j <= N; j++) {
                st = new StringTokenizer(br.readLine());
                String command = st.nextToken();
                long val = Long.parseLong(st.nextToken());

                if(command.equals("I")) push(q, val);
                else if(command.equals("D")) {
                    if(q.size() == 0) continue;
                    if(val == -1) deleteMin(q);
                    else if(val == 1) deleteMax(q);
                }
            }
            if(q.size() == 0) sb.append("EMPTY");
            else {
                sb.append(q.lastKey()).append(" ").append(q.firstKey());
            }
            if(i != T) sb.append("\n");
        }
    }

    static void push(TreeMap<Long,Integer> q, long val) {
        q.put(val, q.getOrDefault(val, 0)+1);
    }

    static void deleteMax(TreeMap<Long,Integer> q) {
        int maxNum = q.get(q.lastKey());
        if(maxNum > 1) {
            q.replace(q.lastKey(), maxNum, maxNum-1);
        }
        else {
            q.remove(q.lastKey());
        }
    }

    static void deleteMin(TreeMap<Long,Integer> q) {
        int minNum = q.get(q.firstKey());
        if(minNum > 1) {
            q.replace(q.firstKey(), minNum, minNum-1);
        }
        else {
            q.remove(q.firstKey());
        }
    }

}
저작자표시 (새창열림)

'Dev > PS' 카테고리의 다른 글

[백준] 21942 부품 대여장 java  (0) 2022.06.16
[백준] 2696 중앙 값 구하기 java  (0) 2022.06.07
[SWEA] 백만 장자 프로젝트 1859 java  (0) 2022.05.27
[백준] 1918 후위 표기식 java  (0) 2022.05.26
[백준] 2493 탑 java  (0) 2022.05.24
'Dev/PS' 카테고리의 다른 글
  • [백준] 21942 부품 대여장 java
  • [백준] 2696 중앙 값 구하기 java
  • [SWEA] 백만 장자 프로젝트 1859 java
  • [백준] 1918 후위 표기식 java
풋데브
풋데브
지속가능한 삶
풋데브
지루함에 익숙해지자
풋데브
전체
오늘
어제
  • 분류 전체보기 (90)
    • 일상 (4)
    • 후기 (2)
    • 운동 (0)
    • Dev (84)
      • PS (72)
      • CS (0)
      • Java (1)
      • Spring (0)
      • DB (4)
      • Test (2)
      • Web (0)
      • 트러블 슈팅 (2)
      • Etc (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • java
  • Developer
  • programming
  • 완전탐색
  • 구현
  • Implement
  • 백트래킹
  • bruteforce
  • 깊이우선탐색
  • codingtest
  • 너비우선탐색
  • 다이나믹프로그래밍
  • combination
  • 개발자
  • 투포인터
  • 자바
  • 백준
  • graph
  • 조합
  • DP
  • 그래프
  • 알고리즘
  • algorithm
  • 백엔드
  • 코딩테스트
  • BFS
  • BOJ
  • 자료구조
  • 코테
  • DFS

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
풋데브
[백준] 7662 이중 우선순위 큐 java
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.