[프로그래머스] 이중우선순위큐 (Heap)

2025. 5. 10. 14:58·Algorithm/Coding Test Records

문제 소개

오늘 풀었던 프로그래머스 - 이중 우선순위 큐 문제를 정리합니다.

이 문제는 문자열로 주어진 명령어 리스트를 따라

  • 숫자를 삽입 / 최댓값 또는 최솟값을 하나씩 삭제 하는 연산을 순차적으로 처리한 후,
  • 큐가 비어 있으면 [0,0], 아니면 [최댓값, 최솟값]을 반환하는 문제입니다.

문제 링크: 이중우선순위큐 - 프로그래머스


문제 접근 방식

이 문제는 다음과 같은 방식으로 접근했습니다:

  1. 중복 값도 관리할 수 있어야 하므로 값과 개수를 함께 저장해야 함
  2. 이를 위해 TreeMap<Integer, Integer> 을 사용
    • 자동 정렬: firstKey(), lastKey()로 최솟값/최댓값에 O(log N)으로 접근 가능
    • 중복 처리: value에 등장 횟수 저장
  3. 연산을 순서대로 처리하면서 적절히 삽입/삭제 처리

해결 과정 및 코드

핵심 아이디어

 

  • TreeMap은 이진 탐색 트리 기반이므로 정렬된 상태 유지
  • 삽입 시 put(k, v), 삭제 시 value를 1 감소시키고 0이면 remove
  • 마지막 결과에서 큐가 비어 있으면 [0,0], 아니면 [lastKey, firstKey]

 

 

코드

시간 복잡도 :O(N log N)

  • N은 연산 수 (최대 1,000,000)
  • 각 삽입/삭제/조회 연산은 TreeMap의 log N 시간에 수행됨
import java.util.*;

class Solution {
    public int[] solution(String[] operations) {
        int[] answer = new int[2];
        TreeMap<Integer, Integer> tree = new TreeMap<>();

        for (String op : operations) {
            StringTokenizer st = new StringTokenizer(op);
            String cmd = st.nextToken();
            int num = Integer.parseInt(st.nextToken());

            if (cmd.equals("I")) { // 삽입
                tree.put(num, tree.getOrDefault(num, 0) + 1);
            } else if (cmd.equals("D") && !tree.isEmpty()) { //삭제
                int key = (num == 1) ? tree.lastKey() : tree.firstKey();
                if (tree.get(key) == 1) {
                    tree.remove(key);
                } else {
                    tree.put(key, tree.get(key) - 1);
                }
            }
        }

        if (!tree.isEmpty()) {
            answer[0] = tree.lastKey();
            answer[1] = tree.firstKey();
        }
        return answer;
    }
}

'Algorithm > Coding Test Records' 카테고리의 다른 글

[프로그래머스] 전화번호 목록 (Hash)  (0) 2025.05.12
[프로그래머스] 폰켓몬 (Hash)  (0) 2025.05.11
[프로그래머스] 디스크 컨트롤러 (Heap)  (0) 2025.05.09
[프로그래머스] 더 맵게 (Heap)  (1) 2025.05.08
[프로그래머스] 가장 먼 노드 (BFS)  (0) 2025.05.07
'Algorithm/Coding Test Records' 카테고리의 다른 글
  • [프로그래머스] 전화번호 목록 (Hash)
  • [프로그래머스] 폰켓몬 (Hash)
  • [프로그래머스] 디스크 컨트롤러 (Heap)
  • [프로그래머스] 더 맵게 (Heap)
Celion
Celion
오늘도 평소처럼 화이팅!
  • Celion
    Orion Log
    Celion
  • 전체
    오늘
    어제
    • 전체 글 (144)
      • Uncompiled Thoughts (8)
        • 네이버 부스트캠프 10기 (5)
      • CS 기초부터 한 걸음씩 (34)
      • Code Odyssey (22)
      • Algorithm (77)
        • Coding Test Records (63)
      • Git (3)
      • reference (0)
  • 블로그 메뉴

    • 태그
    • 방명록
  • 태그

    시뮬레이션
    java
    알고리즘고득점kit
    Level2
    boostcamp
    코테
    프로그래머스
    Kotlin
    Level3
    백준
    문법정리
    greedy
  • 최근 글

  • 인기 글

  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.4
Celion
[프로그래머스] 이중우선순위큐 (Heap)
상단으로

티스토리툴바