개발 공부/알고리즘

hackerrank, c++, Abstract Classes - Polymorphism

그냥하는티스토리 2022. 10. 25. 21:36
728x90

간단할 꺼라 생각했던 문제인데 생각외로 많은 시간이 걸렸다.

링크드 리스트 구현에서 애먹을 줄은 몰랐다.

이럴땐 계속해서 고쳐나가기 보다, 처음부터 다시 짜보는게 더 빠를때도 있는게 그게 바로 오늘인듯 싶다.

 

class LRUCache : public Cache{
public :
    LRUCache(int cpVal)  
    { 
        cp = cpVal;
    }

    void set(int key,int value){
        Node *node = new Node(key,value);
        if(mp.find(key) != mp.end())
        {
            Node *nodePtr = head;
            while(nodePtr->key != node->key)
            {
                nodePtr = node->next;
            }
            
            nodePtr->prev->next = nodePtr->next;
            nodePtr->next->prev = nodePtr->prev;
            delete nodePtr;
            head->prev = node;
            node->next = head;
            head = node;
        }
        else
        {
            if(mp.size() == cp)
            {
                node->next = head->next;
                Node *tailBuf = tail;
                mp.erase(tailBuf->key);
                tail = tail->prev;
                delete tailBuf;
            }
            else
            {
                if(mp.size() == 0)
                {
                    head = node;
                    tail = node;
                }
                else
                {
                    node->next = head->next;
                }
            }
            head = node;
            mp.insert(pair<int, Node*>(key, node));
        }
    }
    
    int get(int key){
        if(mp.find(key) != mp.end())
        {
            return mp.find(key)->second->value;
        }
        else
        {
            return -1;
        }
    }
 
};
728x90