[Kotlin/프로그래머스] 코딩테스트 연습 > 힙(Heap) > 이중우선순위큐

👀 문제

https://school.programmers.co.kr/learn/courses/30/lessons/42628?language=kotlin

👊 도전

1. 설계

  1. 문제 조건에 맞게 진행

2. 구현

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import java.util.*
class Solution {
    fun solution(operations: Array<String>): IntArray {
        val answer = IntArray(2)
/*
1. 우선순위 큐 오름차순, 내림차순 2개 선언
2. i면 둘 다 삽입
3. d 1, -1 이면 두 큐에서 해당 값 존재하면 삭제
   4. 완료후 내림차순[0], 오름차순[0] 리턴
   */
   val maxQueue = PriorityQueue<Int>(kotlin.Comparator { o1, o2 -> o2.compareTo(o1) })
   val minQueue = PriorityQueue<Int>(kotlin.Comparator { o1, o2 -> o1.compareTo(o2) })

           operations.forEach { oper ->
               val split = oper.split(" ")
               val num = split[1].toInt()
               when (split[0]) {
                   "I" -> {
                       maxQueue.offer(num)
                       minQueue.offer(num)
                   }
                   "D" -> {
                       if (num == 1) {
                           val maxInt = maxQueue.poll()
                           minQueue.remove(maxInt)
                       } else {
                           val minInt = minQueue.poll()
                           maxQueue.remove(minInt)
                       }

                   }
               }
           }

           if (maxQueue.isNotEmpty()) answer[0] = maxQueue.peek()
           if (minQueue.isNotEmpty()) answer[1] = minQueue.peek()
           return answer
       }
   }
   

3. 결과

실행결과 🤟 성공 🤟

4. 설명

  1. 우선순위 큐 두 개를 사용한다
    • 오름차순으로 정렬하는 것 하나, 내림차순 하나 사용한다.
    • insert는 모든 큐에 삽입, remove는 1, -1에 따라 최대, 최솟값을 찾아 각 큐에서 제거한다.
    • operation 수행 후 각 큐에서 최대, 최솟값을 리턴한다.

👏 해결 완료!