내 소식

✨컴공주✨ [1052682] · MS 2021 (수정됨) · 쪽지

2023-01-10 00:09:24
조회수 2,443

컴공 일기218

게시글 주소: https://dev.orbi.kr/00061218409

11279번: 최대 힙 (acmicpc.net) 



C++ 표준 라이브러리 STL을 전혀 사용하지 않고, 최대 힙을 직접 구현한 풀이



#include <iostream>

#define HEAP_LEN 1000001

typedef int Heap;

using namespace std;




class CHeap

{

private:

    int Num;

    Heap heapArr[HEAP_LEN];


public:

    CHeap() : Num(0) {}


    int Empty()

    {

        if (Num == 0)

            return 1;

        else

            return 0;

    }


    int GetParentIdx(int idx)

    {

        return idx / 2;

    }


    int GetLChildIdx(int idx)

    {

        return idx * 2;

    }


    int GetRChildIdx(int idx)

    {

        return GetLChildIdx(idx) + 1;

    }


    int GetHiPriChildIdx(int idx)

    {

        if (GetLChildIdx(idx) > Num)

            return 0;


        else if (GetLChildIdx(idx) == Num)

            return GetLChildIdx(idx);


        else

        {

            if (heapArr[GetLChildIdx(idx)] > heapArr[GetRChildIdx(idx)])

                return GetLChildIdx(idx);

            else

                return GetRChildIdx(idx);

        }

    }


    void push(int nParam)

    {

        int idx = Num + 1;


        //큐의 index 0번은 비워놓는다. 부모/자식 index 계산의 편의를 위해서. 

        while (idx != 1)

        {

            if (nParam > heapArr[GetParentIdx(idx)])

            {

                heapArr[idx] = heapArr[GetParentIdx(idx)];

                idx = GetParentIdx(idx);

            }

            else

                break;

        }


        heapArr[idx] = nParam;

        Num++;


        

    }



    int pop()

    {

        int retData = heapArr[1];

        int LastData = heapArr[Num];


        int parentIdx = 1;

        int childIdx;


        while (childIdx = GetHiPriChildIdx(parentIdx))

        {

            if (LastData >= heapArr[childIdx])

                break;

            heapArr[parentIdx] = heapArr[childIdx];

            parentIdx = childIdx;

        }


        heapArr[parentIdx] = LastData;

        Num--;


        

        return retData;

    }


    void Print()

    {

        for (int i = 1; i <= Num; i++)

            cout << heapArr[i] << endl;

    }


    bool empty()

    {

        if (Num == 0)

            return true;

        else

            return false;

    }


};


int main()

{

    CHeap pq;

    int N, x;

    ios_base::sync_with_stdio(0);

    cin.tie(0);

    cin >> N;


    for (int i = 0; i < N; i++)

    {

        cin >> x;

        if (x == 0)

        {

            if (pq.empty()) cout << 0 << '\n';

            else

            {

                cout << pq.pop() << '\n';

            }

        }


        else pq.push(x);

    }

    

    

}

rare-백예린입니다

0 XDK (+0)

  1. 유익한 글을 읽었다면 작성자에게 XDK를 선물하세요.

✨컴공주✨ [1052682]

쪽지 보내기