▸알고리즘 문제 풀이

프로그래머스_힙(Heap)_이중우선순위큐 (JAVA)

코데방 2020. 4. 28.
728x90
문제 설명

이중 우선순위 큐는 다음 연산을 할 수 있는 자료구조를 말합니다.

이중 우선순위 큐가 할 연산 operations가 매개변수로 주어질 때, 모든 연산을 처리한 후 큐가 비어있으면 [0,0] 비어있지 않으면 [최댓값, 최솟값]을 return 하도록 solution 함수를 구현해주세요.

 

제한사항

  • operations는 길이가 1 이상 1,000,000 이하인 문자열 배열입니다.
  • operations의 원소는 큐가 수행할 연산을 나타냅니다.
    • 원소는 “명령어 데이터” 형식으로 주어집니다.- 최댓값/최솟값을 삭제하는 연산에서 최댓값/최솟값이 둘 이상인 경우, 하나만 삭제합니다.
  • 빈 큐에 데이터를 삭제하라는 연산이 주어질 경우, 해당 연산은 무시합니다.

입출력 예

 

입출력 예 설명

16을 삽입 후 최댓값을 삭제합니다. 비어있으므로 [0,0]을 반환합니다.
7,5,-5를 삽입 후 최솟값을 삭제합니다. 최대값 7, 최소값 5를 반환합니다.

 

 

 

최대값과 최소값이 나오면 Heap 트리를 먼저 생각하는 것이 좋습니다. 마지막에 한번에 정렬해서 뽑아내는 것이라면 정렬함수를 사용해도 무방하겠지만 중간중간 요소가 변하면서 계속 최대값과 최소값을 뽑아내기 위해서는 힙트리 구조를 이용해야 시간 복잡도를 줄일 수 있습니다.

 

이 문제 같은 경우는 최대값과 최소값을 동시에 구해야하기 때문에 최소힙트리와 최대힙트리 두 개를 사용하면 됩니다. 만약 힙트리를 직접 작성했다면 그냥 하나의 힙트리에서 해결할 수도 있을 것 같습니다.

 

 


 

직관적인 코드라 따로 주석을 달지는 않았습니다.

 

package pojoPrj;

import java.util.Arrays;
import java.util.PriorityQueue;

class Solution {

	public int[] solution(String[] operations) {

		PriorityQueue<Integer> maxHeap = new PriorityQueue<>((o1, o2) -> o2 - o1);
		PriorityQueue<Integer> minHeap = new PriorityQueue<>();

		for (String a : operations) {

			char order = a.charAt(0);
			int num = Integer.parseInt(a.substring(2));

			if (order == 'I') {

				maxHeap.add(num);
				minHeap.add(num);

			} else if (!maxHeap.isEmpty()) {

				if (num == 1) {
					int max = maxHeap.poll();
					minHeap.remove(max);

				} else {
					int min = minHeap.poll();
					maxHeap.remove(min);
				}
			}
		}

		int max = maxHeap.isEmpty() ? 0 : maxHeap.peek();
		int min = minHeap.isEmpty() ? 0 : minHeap.peek();

		int[] answer = new int[] { max, min };
		return answer;
	}
}

 

728x90

댓글

💲 추천 글