자료구조와 알고리즘/🥑알고리즘

[알고리즘][데크 & 우선순위 큐] - 1. 원형 데크 디자인

얄루몬 2022. 3. 4. 21:20

 

📖이 포스팅은 '파이썬 알고리즘 인터뷰 - 박상길님' 책을 보고 작성되었습니다.


😎문제 : https://leetcode.com/problems/design-circular-deque/submissions/

다음 연산을 제공하는 원형 데크를 디자인 하라.


[이중 연결 리스트를 이용한 데크 구현]

class MyCircularDeque:

    def __init__(self, k: int):
        self.head, self.tail = ListNode(None),ListNode(None)
        self.k, self.len = k, 0
        self.head.right, self.tail.left = self.tail, self.head

    def _add(self,node:ListNode, new: ListNode):
        n = node.right
        node.right = new
        new.left, new.right = node, n
        n.left=new
    def _del(self, node:ListNode):
        n = node.right.right
        node.right =n
        n.left = node

    def insertFront(self, value: int) -> bool:
        if self.len == self.k:
            return False
        self.len += 1
        self._add(self.head, ListNode(value))
        return True

    def insertLast(self, value: int) -> bool:
        if self.len == self.k:
            return False
        self.len += 1
        self._add(self.tail.left, ListNode(value))
        return True

    def deleteFront(self) -> bool:
        if self.len == 0:
            return False
        self.len -= 1
        self._del(self.head)
        return True

    def deleteLast(self) -> bool:
        if self.len == 0:
            return False
        self.len -= 1
        self._del(self.tail.left.left)
        return True


    def getFront(self) -> int:
        return self.head.right.val if self.len else -1
        

    def getRear(self) -> int:
        return self.tail.left.val if self.len else -1
        
        
    def isEmpty(self) -> bool:
        return self.len == 0
    
    def isFull(self) -> bool:
        return self.len == self.k