πŸ“•Week1 day2(14-16)

박쀀희·2023λ…„ 8μ›” 23일

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

λͺ©λ‘ 보기
2/28
post-thumbnail

큐(Queue)

큐(queue)λŠ” 데이터 μ›μ†Œλ₯Ό ν•œ μ€„λ‘œ λŠ˜μ–΄μ„Έμš°λŠ” 자료 ꡬ쑰

πŸ“’ν λ˜ν•œ μ„ ν˜•κ΅¬μ‘°λΌλŠ” μ μ—μ„œ μŠ€νƒκ³Ό μœ μ‚¬ν•˜μ§€λ§Œ λ°˜λŒ€μ˜ μ„±μ§ˆμ„ κ°€μ§€κ³  μžˆμŠ΅λ‹ˆλ‹€. μ–΄λŠ μ‹œμ μ—μ„œ 큐에 λ“€μ–΄ μžˆλŠ” 데이터 μ›μ†Œλ₯Ό κΊΌλ‚΄λ©΄ 큐에 λ“€μ–΄ μžˆλŠ” μ›μ†Œλ“€ 쀑 κ°€μž₯ λ¨Όμ € λ„£μ—ˆλ˜ 것이 κΊΌλ‚΄μ§‘λ‹ˆλ‹€. λ”°λΌμ„œ 큐λ₯Ό μ„ μž…μ„ μΆœ (FIFO; first-in first-out) 이라고도 λΆ€λ¦…λ‹ˆλ‹€.

큐의 λ™μž‘


큐의 λ™μž‘λ„ μŠ€νƒκ³Ό μœ μ‚¬ν•©λ‹ˆλ‹€. λΉ„μ–΄μžˆλŠ” 큐λ₯Ό 생성, μŠ€νƒμ— 데이터λ₯Ό μΆ”κ°€, 큐 μ•ˆμ˜ 데이터λ₯Ό μΆ”μΆœ.

큐의 μ—°μ‚°


  • size(): ν˜„μž¬ 큐에 λ“€μ–΄ μžˆλŠ” 데이터 μ›μ†Œμ˜ 수λ₯Ό ꡬ함
  • isEmpty(): ν˜„μž¬ 큐가 λΉ„μ–΄ μžˆλŠ”μ§€λ₯Ό νŒλ‹¨ (size() == 0?)
  • enqueue(): 데이터 μ›μ†Œλ₯Ό 큐에 μΆ”κ°€
  • dequeue(): 큐에 κ°€μž₯ 처음 μ €μž₯된 데이터 μ›μ†Œλ₯Ό 제거(λ°˜ν™˜)
  • peek(): 큐에 κ°€μž₯ μ²˜μŒμ— μ €μž₯된 데이터 μ›μ†Œλ₯Ό μ°Έμ‘° (λ°˜ν™˜), κ·ΈλŸ¬λ‚˜ μ œκ±°ν•˜μ§€λŠ” μ•ŠμŒ

큐 κ΅¬ν˜„ν•˜κΈ°


νλŠ” μ„ ν˜• 배열을 μ΄μš©ν•œ μ—°κ²° λ¦¬μŠ€νŠΈμ—μ„œ 디큐 연산이 큐의 길이에 λΉ„λ‘€ν•˜λŠ” 만큼의 μ‹œκ°„μ„ μ†Œμš”ν•©λ‹ˆλ‹€. 배열에 μ €μž₯된 데이터 μ›μ†Œλ“€μ„ ν•˜λ‚˜ν•˜λ‚˜ μ•ž 칸으둜 λ‹Ήκ²¨μ„œ μœ„μΉ˜λ₯Ό μ‘°μ •ν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. κ·Έλž˜μ„œ μ—°μ‚°μ˜ μ‹œκ°„ λ³΅μž‘λ„ μΈ‘λ©΄μ—μ„œλŠ” μ—°κ²° 리슀트둜 큐λ₯Ό κ΅¬ν˜„ν•˜λŠ” 것이 μœ λ¦¬ν•©λ‹ˆλ‹€.

λ‹€μŒμ€ μ—°κ²°λ¦¬μŠ€νŠΈλ‘œ κ΅¬ν˜„ν•œ 큐의 μ½”λ“œ μž…λ‹ˆλ‹€.

class LinkedListQueue:

    def __init__(self):
        self.data = DoublyLinkedList()

    def size(self):
        return self.data.getLength()

    def isEmpty(self):
        return self.data.getLength()==0

    def enqueue(self,item):
        node = Node(item)
        self.data.insertAt(self.data.nodeCount+1, node)


    def dequeue(self):
        return self.data.popAt(1)

    def peek(self):
        return self.data.getAt(1).data

def solution(x):
    return 0

ν™˜ν˜• 큐(Circular Queue)


πŸ“’ν™˜ν˜• νλŠ” μ •ν•΄μ§„ 개수의 μ €μž₯곡간을 λΉ™ λŒλ €κ°€λ©° μ΄μš©ν•©λ‹ˆλ‹€. 큐가 가득차면 μ‚¬μš© λΆˆκ°€λŠ₯ν•˜κ³ , 큐 길이λ₯Ό κΈ°μ–΅ν•˜κ³  μžˆμ–΄μ•Όλ©λ‹ˆλ‹€.

ν™˜ν˜• 큐의 연산은 μ§€λ‚œλ²ˆ 큐와 λ™μΌν•œ μ—°μ‚° + isFull()이 μΆ”κ°€λ˜μ—ˆμŠ΅λ‹ˆλ‹€. isFull() 연산은 큐에 데이터 μ›μ†Œκ°€ 꽉 μ°¨ μžˆλŠ”μ§€λ₯Ό νŒλ‹¨ν•˜λŠ” μ—°μ‚°μž…λ‹ˆλ‹€.

λ‹€μŒμ€ λ°°μ—΄λ‘œ κ΅¬ν˜„ν•œ ν™˜ν˜• 큐 μ½”λ“œμž…λ‹ˆλ‹€.

class CircularQueue:
    def __init__(self,n):
        self.maxCount = n
        self.data = [None]*n
        self.count = 0
        self.front = -1
        self.rear = -1

    def size(self):
        return self.count

    def isEmpty(self):
        return self.count ==0

    def isFull(self):
        return self.count == self.maxCount

    def enqueue(self, x):
        if self.isFull():
            raise IndexError('Queue full')
        self.rear = (self.rear + 1) % self.maxCount
        # λΉ™ λŒμ•„μ•Ό ν•˜λ―€λ‘œ maxCount λ‚˜λˆˆ λ‚˜λ¨Έμ§€κ°€ index
        self.data[self.rear]=x
        self.count+=1

    def dequeue(self):
        if self.isEmpty():
            raise IndexError('Queue empty')
        self.front = (self.front + 1) % self.maxCount
        x = self.data[self.front]
        self.count -= 1
        return x

    def peek(self):
        if self.isEmpty():
            raise IndexError('Queue empty')
        return self.data[(self.front + 1) % self.maxCount]

μš°μ„ μˆœμœ„ 큐(Priority Queues)


μš°μ„ μˆœμœ„ 큐(Priority Queues)λŠ” 큐에 μ›μ†Œλ₯Ό μΆ”κ°€ν•˜λŠ” 연산은 λ‹€λ₯Έ 점이 μ—†λ˜, νμ—μ„œ μ›μ†Œλ₯Ό κΊΌλ‚΄λŠ” 원칙은 μ›μ†Œλ“€ μ‚¬μ΄μ˜ μš°μ„ μˆœμœ„μ— λ”°λ₯΄λŠ” μžλ£Œκ΅¬μ‘°μ΄λ‹€.

μš°μ„ μˆœμœ„ 큐λ₯Ό κ΅¬ν˜„ν•˜λŠ” λ°μ—λŠ” 두 κ°€μ§€μ˜ μ„œλ‘œ λ‹€λ₯Έ μ ‘κ·Ό 방법을 생각할 수 μžˆμŠ΅λ‹ˆλ‹€

  • 큐에 μ›μ†Œλ₯Ό 넣을 λ•Œ (enqueue ν•  λ•Œ) μš°μ„ μˆœμœ„ μˆœμ„œλŒ€λ‘œ μ •λ ¬ν•΄ λ‘λŠ” 방법
  • νμ—μ„œ μ›μ†Œλ₯Ό κΊΌλ‚Ό λ•Œ (dequeue ν•  λ•Œ) μš°μ„ μˆœμœ„κ°€ κ°€μž₯ 높은 것을 μ„ νƒν•˜λŠ” 방법

μ—¬κΈ°μ„œλŠ” μ–‘λ°©ν–₯ μ—°κ²° 리슀트λ₯Ό μ„ νƒν•˜μ—¬ μš°μ„ μˆœμœ„ 큐λ₯Ό κ΅¬ν˜„ν•˜κΈ°λ‘œ ν•˜κ³ , μ›μ†Œλ₯Ό μΆ”κ°€ν•  λ•Œ μš°μ„ μˆœμœ„μ— λ”°λ₯Έ μ•Œλ§žμ€ 자리λ₯Ό μ°Ύμ•„μ„œ μ •λ ¬λœ ν˜•νƒœλ‘œ μœ μ§€ν•΄ 두고 κΊΌλ‚Ό λ•Œ ν•œ μͺ½ λμ—μ„œ κΊΌλ‚Ό 수 μžˆλ„λ‘ μ½”λ“œλ₯Ό λ§Œλ“€μ–΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

class PriorityQueue:

    def __init__(self):
        self.queue = DoublyLinkedList()

    def size(self):
        return self.queue.getLength()

    def isEmpty(self):
        return self.size() == 0

    def enqueue(self, x):
        newNode = Node(x)
        curr = self.queue.head
        while curr.next.data != None and x < curr.next.data:
            curr = curr.next
        self.queue.insertAfter(curr, newNode)

    def dequeue(self):
        return self.queue.popAt(self.queue.getLength())

    def peek(self):
        return self.queue.getAt(self.queue.getLength()).data

! μš°μ„ μˆœμœ„ νλŠ” λ‚˜μ€‘μ— 쑰금 λ‹€λ₯Έ 자료 ꡬ쑰λ₯Ό μ΄μš©ν•˜μ—¬ λ”μš± 효율적으둜 κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.


πŸ’‘ν™˜ν˜• 큐λ₯Ό κ΅¬ν˜„ν•¨μ— μžˆμ–΄μ„œ μ„ ν˜•λ°°μ—΄λ‘œ κ΅¬ν˜„ν•˜μ˜€μ§€λ§Œ, μ–‘λ°©ν–₯ μ—°κ²°λ¦¬μŠ€νŠΈλ₯Ό μ‚¬μš©ν•˜μ—¬ κ΅¬ν˜„ν•œλ‹€λ©΄ 큐의 크기가 μ œν•œλ˜μ§€ μ•Šκ³  ν•„μš”ν•œ λ©”λͺ¨λ¦¬λ§Œ μ‚¬μš©ν•  수 μžˆλ‹€λŠ” μž₯점이 μžˆμ„ 것 κ°™λ‹€.

profile
κ²Œμ„λ €λ˜ ν”„λ‘œκ·Έλž˜λ° 곡뢀

0개의 λŒ“κΈ€