Blog Content

    티스토리 뷰

    [자료구조/문제] 중앙값(Median) 구하기, BOJ 2696, Heap

    문제 : https://www.acmicpc.net/problem/2696


    홀수번째 수를 읽을 때마다 지금까지 입력받은 수의 중앙값을 구하는 문제이다.

    이 문제는 Heap을 이용하여 풀 수 있다.

    Heap은 수를 담는 자료구조로, Java에서는 우선순위큐(PriorityQueue)로 구현할 수 있다.

    Heap은 완전이진트리이며, 모든 정점은 자신의 자식보다 우선순위가 높다는 것이 중요한 성질 중 하나이다.


    Top이 최대값인 우선순위큐를 최대힙(MaxHeap)

    Top이 최소값인 우선순위큐를 최소힙(MinHeap) 이라고 한다.

    따라서, MaxHeap은 담긴 수 중 최대값을 바로 알 수 있고 최대값을 pop할 수 있다.

    또한 MinHeap은 담긴 수 중 최소값을 바로 알 수 있고 최소값을 pop할 수 있다.


    PriorityQueue를 이용하여 MaxHeap과 MinHeap을 만드는 방법은 세가지 방법이 있다.


    문제풀이

    Heap의 성질을 이용하여 중앙값보다 작을 값들은 MaxHeap에, 중앙값보다 큰 값들은 MinHeap에 넣어준다.

    1. 일단 처음에 왼쪽부터(MaxHeap) 넣는다.

    2. 오른쪽(MinHeap)이 비어있거나, 오른쪽의 최소값보다 작은 값이 들어올 경우 MaxHeap에 넣어준다.

    3. MaxHeap과 MinHeap의 사이즈를 공평하게 해준다.

    3-1. MaxHeap의 사이즈가 MinHeap의 사이즈보다 2개 이상 많을 때 MaxHeap의 top값을 MinHeap으로 이동시켜준다.

    3-2. MinHeap의 사이즈가 MaxHeap의 사이즈보다 커질 때는 MinHeap의 top값을 MaxHeap으로 이동시켜준다.

    4. 홀수번째 수가 주어질 때마다 MaxHeap의 Top값을 출력한다.



    Comments