스파르타 알고리즘 트랙 문제(백준)/5일차
스파르타 알고리즘 트랙 문제 5일차 - 2 #11279 최대 힙
인생은야메다
2023. 7. 31. 15:22
문제
널리 잘 알려진 자료구조 중 최대 힙이 있다. 최대 힙을 이용하여 다음과 같은 연산을 지원하는 프로그램을 작성하시오.
- 배열에 자연수 x를 넣는다.
- 배열에서 가장 큰 값을 출력하고, 그 값을 배열에서 제거한다.
프로그램은 처음에 비어있는 배열에서 시작하게 된다.
해결 과정
힙 자료구조를 구현하여 해결하는 문제이다.
힙은 이진 트리 구조로 형성되어 부모 노드의 값이 자식 노드의 값보다 무조건 큰, 혹은 작은 형태의 자료구조이다. 따라서 힙을 구현한 후, 그 자료구조에 1의 경우는 값을 집어넣는 메소드를, 2의 경우는 값을 빼는 메소드를 작성하면 될 것으로 보인다.
Java에서는 PriorityQueue라는 이미 힙 형태로 만들어진 자료구조 클래스가 존재하여 이를 사용하여 문제를 해결해 보았다.
import java.io.*; import java.util.*; public class Main { public static void main(String[] args) throws IOException { Scanner sc = new Scanner(System.in); int N = sc.nextInt(); PriorityQueue<Integer> arr = new PriorityQueue<>(Collections.reverseOrder()); while(N!=0){ int num = sc.nextInt(); if (num==0) { System.out.println(arr.size()==0?0:arr.remove()); } else { arr.add(num); } N--; } } } |
입력받은 숫자가 0일 경우, 힙의 크기가 0일 경우 0을, 크기가 0이 아닐 경우 데이터를 빼온 후 출력하고, 그 외의 경우에는 힙에 저장하는 형태로 코드를 구성하였다.
이미 만들어진 class와 메소드를 사용하여 크게 어렵지 않은 문제였으나, LinkedList 형태의 이진 트리 클래스를 직접 만들어 해결해 보는 것도 좋을 듯하다.