[Algorithm] 백준_이중 우선순위 큐_7662번 (JAVA) TreeMap

2025. 3. 21. 16:09·Algorithm

📝문제

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

이중 우선순위 큐 7662번

티어: 골드 4

💡풀이

문제 유형

자료 구조
트리를 사용한 집합과 맵
우선순위 큐

 

걸린 시간

60분

 

시간 복잡도

O(T×klogk)

 

풀이 방법 도출

  1. deque를 이용해서 시도했다가 시간초과 에러가 났고 우선순위 큐를 이용하려다 실패하고 결국 TreeMap이라는 자료구조를 사용하게 되었다.
  2. TreeMap이란 정렬된 맵으로 항상 키가 정렬된 상태로 유지되며, O(log N)의 시간 복잡도로 데이터를 삽입, 삭제, 조회할 수 있다. HashMap의 정렬된 버전이라고 생각하면 쉽다. (HashMap보다 삽입/삭제는 느리지만 정렬된 데이터를 다룰 때 훨씬 효율적이다.)
    1. firstKey(): 최솟값 찾기
    2. lastKey(): 최댓값 찾기
    3. pollFirstEntry(): 최솟값 삭제
    4. pollLastEntry(): 최댓값 삭제
  3.  treeMap을 선언 후 key에는 n을, value에는 n의 개수를 넣어준다.
  4. D가 입력되면 -1일떄는 firstKey()를, 1일 때는 lastKey()를 사용해 key를 찾고 
  5. 해당 key의 value값이 1이면 삭제해주고, 1이 아니라면 기존 value값에 -1을 해주고, 이를 반복한다.
  6. 이후 treeMap에 남은 key들 중 fistKey()와 lastKey()를 찾아주면 된다.
import java.util.*;
import java.io.*;
class Main{
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < T; i++){
            TreeMap<Integer, Integer> treeMap = new TreeMap<>();
            int k = Integer.parseInt(br.readLine());
            for(int j = 0; j < k; j++){
                StringTokenizer st = new StringTokenizer(br.readLine());
                String command = st.nextToken();
                int n = Integer.parseInt(st.nextToken());
                if("I".equals(command)){
                    treeMap.put(n, treeMap.getOrDefault(n,0)+1);
                }
                if("D".equals(command)){
                    if(treeMap.isEmpty()) continue;
                    int key = 0;
                    if(n == 1){//최대값
                        key = treeMap.lastKey();
                    }
                    if(n == -1){//최솟값
                        key = treeMap.firstKey();
                    }
                    if(treeMap.get(key) == 1){
                        treeMap.remove(key);
                    }else{
                        treeMap.put(key, treeMap.get(key)-1);
                    }
                }
            }
            if(treeMap.isEmpty()){
                sb.append("EMPTY");
            }else{
                sb.append(treeMap.lastKey()).append(" ").append(treeMap.firstKey());
            }
            sb.append("\n");
        }
        System.out.println(sb);
    }
}

 

🤔Review

TreeMap의 개념을 잘 몰랐는데 이 문제를 통해서 개념을 짚고 넘어간다. 🌳

'Algorithm' 카테고리의 다른 글

[Algorithm] 백준_DNA 비밀번호_12891번 (JAVA) 슬라이딩 윈도우  (0) 2025.03.23
[Algorithm] 백준_평범한 배낭_12865번 (JAVA) 🎒  (0) 2025.03.23
[Algorithm] 백준_특정한 최단 경로_1504번 (JAVA)  (1) 2025.03.20
[Algorithm] 백준_수들의 합 5_2018번 (JAVA)  (2) 2025.03.18
[Algorithm] 백준_토마토_7569번 (JAVA) 🍅  (0) 2025.03.18
'Algorithm' 카테고리의 다른 글
  • [Algorithm] 백준_DNA 비밀번호_12891번 (JAVA) 슬라이딩 윈도우
  • [Algorithm] 백준_평범한 배낭_12865번 (JAVA) 🎒
  • [Algorithm] 백준_특정한 최단 경로_1504번 (JAVA)
  • [Algorithm] 백준_수들의 합 5_2018번 (JAVA)
dev_ajrqkq
dev_ajrqkq
알고리즘 천재가 될 거야
  • dev_ajrqkq
    기록이 자산이다
    dev_ajrqkq
  • 전체
    오늘
    어제
    • 분류 전체보기 (139)
      • Front-end (0)
      • Back-end (11)
        • Spring (1)
        • Java (8)
      • CS (9)
        • 데이터베이스 (5)
        • 네트워크 (4)
      • Algorithm (72)
      • 이것저것 (0)
      • 버그잡기 (1)
      • TIL (37)
      • 후기 (1)
      • 취준 (0)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      개발자취업
      티스토리챌린지
      Til
      항해99
      TypeScript
      코딩테스트준비
      99클럽
      오블완
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.2
    dev_ajrqkq
    [Algorithm] 백준_이중 우선순위 큐_7662번 (JAVA) TreeMap
    상단으로

    티스토리툴바