798´ÔÀÇ ±¸Çö
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.

¾îÁÝÀÝ°Ô ÅÛÇø´ ½á ºÃ½À´Ï´Ù. ÇÑ ¸»¾¸ ºÎʵå·Á¿ä~
¸¸µé°í º¸´Ï ±×³É PriorityQueue¸¦ ±¸ÇöÇÑ °Í »ÓÀ̳׿ä.
¹º°¡ TOP N°³¸¦ À§ÇÑ Æ¯º°ÇÑ ºÎºÐÀÌ ÇÊ¿äÇÒÅÙµ¥...
´Ù¸¥ ·¹ÆÛ·±½º ¾È º¸°í È¥ÀÚ ³©³©´ë¼­ ±¸ÇöÇß´Ù´Â °Í¿¡ ÀÇÀǸ¦ µÎ·Á°í ÇÕ´Ï´Ù.
#include <iostream> 
 
using namespace std; 
 
template <typename T, class Comparator> 
class PQueue { 
private : 
        struct PQueueNode { 
                T data; 
                PQueueNode* left; 
                PQueueNode* right; 
                PQueueNode(T value) : data(value), left(NULL), right(NULL) {} 
                ~PQueueNode() { 
                        if (left!=NULL) { 
                                delete left; 
                        } 
                        if (right!=NULL) { 
                                delete right; 
                        } 
                } 
                void enqueue(T value) { 
                        Comparator cmp; 
                        if (cmp(value, data)>0) { 
                                if (right==NULL) { 
                                        right=new PQueueNode(data); 
                                } else { 
                                        if (left==NULL) { 
                                                left=right; 
                                                right=new PQueueNode(data); 
                                        } else { 
                                                T temp=right->data; 
                                                left->data=right->data; 
                                                right->data=data; 
                                                left->enqueue(temp); 
                                        } 
                                } 
                                data=value; 
                        } else { 
                                if (right==NULL) { 
                                        right=new PQueueNode(value); 
                                } else { 
                                        if (left!=NULL) { 
                                                if (cmp(value, left->data)>0) { 
                                                        right->enqueue(value); 
                                                } else { 
                                                        left->enqueue(value); 
                                                } 
                                        } else { 
                                                right->enqueue(value); 
                                        } 
                                } 
                        } 
                } 
                bool dequeue() { 
                        if (right!=NULL) { 
                                data=right->data; 
                                if (right->dequeue()==true) { 
                                        if (left!=NULL) { 
                                                right->data=left->data; 
                                                if (left->dequeue()==true) { 
                                                        delete left; 
                                                        left=NULL; 
                                                } 
                                        } else { 
                                                delete right; 
                                                right=NULL; 
                                        } 
                                } 
                                return false; 
                        } 
                        return true; 
                } 
        }; 
        PQueueNode* root; 
public : 
        PQueue() : root(NULL) {} 
        ~PQueue() { 
                if (root!=NULL) { 
                        delete root; 
                } 
        } 
        bool isEmpty() { 
                return (root==NULL); 
        } 
        void enqueue(T value) { 
                if (root==NULL) { 
                        root=new PQueueNode(value); 
                } else { 
                        root->enqueue(value); 
                } 
        } 
        T dequeue() { 
                // assuming root is not null 
                T result=root->data; 
                if (root->dequeue()==true) { 
                        delete root; 
                        root=NULL; 
                } 
                return result; 
        } 
}; 
 
 
struct IntComparator { 
        int operator () (int& left, int& right) { 
                if (left>right) { 
                        return 1; 
                } else if (left==right) { 
                        return 0; 
                } 
                return -1; 
        } 
}; 
 
int main(int argc, char** argv) { 
        PQueue<int, IntComparator> queue; 
 
        srand(time(NULL)); 
 
        int temp; 
        for (int i=0;i<10;++i) { 
                temp=rand(); 
                queue.enqueue(temp); 
                cout<<\"Enqueue \"<<temp<<endl; 
        } 
 
        while (!queue.isEmpty()) { 
                temp=queue.dequeue(); 
                cout<<\"Dequeue \"<<temp<<endl; 
        } 
} 
 
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.