https://school.programmers.co.kr/learn/courses/30/lessons/42628
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제
이중 우선 순위 큐는 다음 연산을 할 수 있는 자료 구조를 말합니다.
명령어 | 수신 탑(높이) |
I 숫자 | 큐에 주어진 숫자를 삽입 |
D 1 | 큐에서 최댓값을 삭제 |
D -1 | 큐에서 최솟값을 삭제 |
이중 우선순위 큐가 할 연산 operations가 매개변수로 주어질 때, 모든 연산을 처리한 후 큐가 비어있으면 [0,0] 비어있지 않으면 [최댓값, 최솟값]을 return 하도록 solution함수를 구현하시오
제한사항
- operations는 길이가 1 이상 1,000,000 이하인 문자열 배열
- operations의 원소는 큐가 수행할 연산을 나타냄
- 원소는 "명령어 데이터" 형식으로 주어집니다. 최댓값/최솟값을 삭제하는 연산에서 최댓값/최솟값이 둘 이상인 경우, 하나만 삭제합니다.
- 빈 큐에 데이터를 삭제하라는 연산이 주어질 경우, 해당 연산은 무시합니다.
입출력 예 1
operations
["I 16", "I -5643", "D -1", "D 1", "D 1", "I 123", "D -1"]
return
[0,0]
설명
16과 -5643을 삽입합니다 [16, -5643]
D -1이므로 최솟값을 삭제합니다 [16]
D 1이므로 최댓값을 삭제합니다 [ ]
D 1인데 아무것도 없으므로 무시합니다
I 123 이므로 123을 삽입합니다 [123]
D -1이므로 최솟값을 삭제합니다 [ ]
return
빈 배열이기 때문에 [0,0]을 리턴
입출력 예 2
["I -45", "I 653", "D 1", "I -642", "I 45", "I 97", "D 1", "D -1", "I 333"]
-45와 653을 삽입합니다. [-45, 653]
D 1이므로 최댓값을 삭제합니다 [-45]
-642, 45, 97값을 삽입합니다[-45, -642, 45, 97]
D 1이므로 최댓값을 삭제합니다 [-45, -642, 45]
D -1이므로 최솟값을 삭제합니다 [-45, 45]
333을 삽입합니다[-45, 45, 333]
return
최댓값, 최솟값 을 반환하므로 [333,-45]을 반환합니다.
첫번째 시도
우선순위를 구해야하기 때문에 우선순위 큐인 PriorityBlockingQueue라는 것이 있다. FIFO과 다른 우선순위를 기준으로 동작합니다.
우선순위 큐에 대해서는 자료구조 큐의 종류와 특징을 주제로 포스팅 해두었습니다!
트리 구조를 구현해야하는 구조입니다.
- 최대, 최소 힙을 생성해야 합니다.
- I 값 이라면 최대 최소 힙에 모두 삽입합니다.
- D 1이라면 최대 힙에서 pop, D -1이면 최소 힙에서 poll
- 3과 동시에 최대, 최소 힙에서도 동시에 해당 값을 삭제합니다.
import java.util.Collections; // 최대 힙 만들기 위해서 (reverseOrder()함수)
import java.util.PriorityQueue; // 우선순위 큐
class Solution {
public int[] solution(String[] operations) {
int[] answer = {0,0};
// PriorityQueue<Integer>은 우선순위가 높은게 작은 수인 것 기본
PriorityQueue<Integer> heap = new PriorityQueue<Integer>(); // 최소 힙
PriorityQueue<Integer> maxHeap = new PriorityQueue<Integer>(Collections.reverseOrder()); // 최대 힙
for (int i=0; i<operations.length; i++){ //operations값을 읽어올 반복문
String st = operations[i].split(" ")[0]; // I인지 D인지 파악하기
String num = operations[i].split(" ")[1]; // 값 확인
int value = Integer.parseInt(num);
System.out.println(value);
// 경우의 수로 값을 추가, 삭제
if (heap.size() < 1 && st.equals("D")){ // 힙에 값이 없고 D라면
// 삭제할 수 있는 값이 없으므로 continue;
continue;
}
if (st.equals("I")){ // 추가라면 최소, 최대 힙 모두 값 추가
heap.offer(value);
maxHeap.offer(value);
continue;
}
if (value < 0){
// -1 : 최소 힙 poll()
// 1 : 최대 힙 poll()
// 1이면
int min = heap.poll(); // 최소 힙에서 poll
maxHeap.remove(min); // 해당 값을 삭제
continue;
}
int max = maxHeap.poll(); //최대 힙에서 poll
heap.remove(max); // 해당 값을 삭제
}
if(heap.size() > 0 ){
answer[0] = maxHeap.poll();
answer[1] = heap.poll();
System.out.println(answer[0] + " , " + answer[1] );
}
return answer;
}
}
참고
[프로그래머스] 이중 우선순위 큐
프로그래머스, Java, Level 3, 이중 우선순위 큐
velog.io
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] [PCCP 기출문제] 1번 / 붕대 감기(javascript) (3) | 2024.11.09 |
---|---|
[프로그래머스] [PCCP 기출문제] 1번 / 동영상 재생기(Javascript) (0) | 2024.10.30 |
[프로그래머스] Lv.2 연속된 부분 수열의 합(Java) (0) | 2023.09.22 |
[프로그래머스]Lv2. 조건에 부합하는 중고거래 상태 조회하기(SQL) (0) | 2023.09.14 |
[프로그래머스]Lv2.달리기 경주 달리기 경주(Java) (0) | 2023.09.14 |