728x90
반응형
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의 원소는 큐가 수행할 연산을 나타냅니다.
- 원소는 “명령어 데이터” 형식으로 주어집니다.- 최댓값/최솟값을 삭제하는 연산에서 최댓값/최솟값이 둘 이상인 경우, 하나만 삭제합니다.
- 빈 큐에 데이터를 삭제하라는 연산이 주어질 경우, 해당 연산은 무시합니다.
입출력 예
operations | return |
["I 16", "I -5643", "D -1", "D 1", "D 1", "I 123", "D -1"] | [0,0] |
["I -45", "I 653", "D 1", "I -642", "I 45", "I 97", "D 1", "D -1", "I 333"] | [333, -45] |
입출력 설명
입출력 예 #1
- 16과 -5643을 삽입합니다.
- 최솟값을 삭제합니다. -5643이 삭제되고 16이 남아있습니다.
- 최댓값을 삭제합니다. 16이 삭제되고 이중 우선순위 큐는 비어있습니다.
- 우선순위 큐가 비어있으므로 최댓값 삭제 연산이 무시됩니다.
- 123을 삽입합니다.
- 최솟값을 삭제합니다. 123이 삭제되고 이중 우선순위 큐는 비어있습니다.
따라서 [0, 0]을 반환합니다.
나의 풀이
- 두 개의 우선순위 큐 활용 -> 오름차순 정렬 큐, 내림차순 정렬 큐
- 큐에 원소를 삽입할 때, 두개의 큐에 동시 삽입.
- 이후, 최대/최소 값을 지울 때도 동일한 원소를 두 큐에서 지워야하므로 poll(), remove(Object o) 메서드 사용
- 문자열 연산이 끝나면 남아있는 원소들을 정렬한 뒤 배열로 return
- 큐가 비어있을 경우 {0, 0}을 반환
class Solution {
static Queue<Integer> min = new PriorityQueue<>();
static Queue<Integer> max = new PriorityQueue<>(Comparator.reverseOrder());
public int[] solution(String[] operations) {
for (String oper : operations) {
operation(oper);
}
if (min.isEmpty()) {
return new int[] {0, 0};
}
List<Integer> answer = new ArrayList<>();
answer.addAll(min);
Collections.sort(answer, Comparator.reverseOrder());
return new int[] {answer.get(0), answer.get(answer.size() - 1)};
}
private void operation(String oper) {
String[] devide = oper.split(" ");
if (Objects.equals(devide[0], "I")) {
addNumber(devide[1]);
} else if (Objects.equals(devide[1], "-1")) {
rmMin();
} else {
rmMax();
}
}
private void addNumber(String num) {
Integer n = Integer.parseInt(num);
max.add(n);
min.add(n);
}
private void rmMax() {
if (!max.isEmpty()) {
Integer poll = max.poll();
min.remove(poll);
}
}
private void rmMin() {
if (!min.isEmpty()) {
Integer poll = min.poll();
max.remove(poll);
}
}
}
728x90
반응형