ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๋ฐ˜์‘ํ˜•

๋“œ๋””์–ด ํ! ์Šคํƒ๊ณผ ๋”๋ถˆ์–ด ๋งค์šฐ ๋นˆ๋ฒˆํ•˜๊ฒŒ ์ด์šฉ๋˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. ํ๋Š” ์ž๋ฃŒ(data element)๋ฅผ ๋ณด๊ด€ํ•  ์ˆ˜ ์žˆ๋Š” ์„ ํ˜•๊ตฌ์กฐ๋กœ ์„ ํ˜•๋ฐฐ์—ด, ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ, ์Šคํƒ๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ ์Šคํƒ๊ณผ๋Š” ๋ฐ˜๋Œ€์ธ ํŠน์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ํ๋Š” ๋„ฃ์„ ๋•Œ์—๋Š” ํ•œ ์ชฝ ๋์—์„œ ๋ฐ€์–ด ๋„ฃ์–ด์•ผ(enqueue์—ฐ์‚ฐ)ํ•˜๊ณ  ๊บผ๋‚ผ ๋•Œ์—๋Š” ๋ฐ˜๋Œ€ ์ชฝ์—์„œ ๋ฝ‘์•„ ๊บผ๋‚ด๋Š”(dequeue์—ฐ์‚ฐ) ์„ ์ž…์„ ์ถœ(FIFO; First-In First-Out)์˜ ํŠน์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

 

 

ํ์˜ ๋™์ž‘

 

 

ํ์˜ ์ถ”์ƒ์  ์ž๋ฃŒ๊ตฌ์กฐ ๊ตฌํ˜„

1. ๋ฐฐ์—ด(array)์„ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„

  • python ๋ฆฌ์ŠคํŠธ์™€ ๋ฉ”์„œ๋“œ๋“ค์„ ์ด์šฉ

2. ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ(linked list)๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„

  • ์ด์ „์— ๊ตฌํ˜„ํ•œ ์–‘๋ฐฉํ–ฅ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ์ด์šฉ

 

 

์—ฐ์‚ฐ์˜ ์ •์˜

  • size() - ํ˜„์žฌ ํ์— ๋“ค์–ด์žˆ๋Š” ๋ฐ์ดํ„ฐ ์›์†Œ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•จ
  • isEmpty() - ํ˜„์žฌ ํ๊ฐ€ ๋น„์–ด์žˆ๋Š”์ง€๋ฅผ ํŒ๋‹จ
  • enqueue(x) - ๋ฐ์ดํ„ฐ ์›์†Œ x๋ฅผ ํ์— ์ถ”๊ฐ€
  • dequeue() - ํ์˜ ๋งจ ์•ž์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ ์›์†Œ๋ฅผ ์ œ๊ฑฐ(๋˜๋Š” ๋ฐ˜ํ™˜)
  • peek() - ํ์˜ ๋งจ ์•ž์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ ์›์†Œ๋ฅผ ๋ฐ˜ํ™˜(์ œ๊ฑฐํ•˜์ง€ ์•Š์Œ)

 

 

 

๋ฐฐ์—ด๋กœ ๊ตฌํ˜„ํ•œ ํ

# ๋ฐฐ์—ด๋กœ ๊ตฌํ˜„ํ•œ ํ
class ArrayQueue:
    # ๋นˆ ํ๋ฅผ ์ดˆ๊ธฐํ™”
    def __init__(self):
        self.data = []
        
    # ํ์˜ ํฌ๊ธฐ๋ฅผ ๋ฆฌํ„ด
    def size(self):
        return len(self.data)

    # ํ๊ฐ€ ๋น„์–ด์žˆ๋Š”์ง€ ํŒ๋‹จ
    def isEmpty(self):
        return self.size() == 0
    
    # ๋ฐ์ดํ„ฐ ์›์†Œ ์ถ”๊ฐ€ ์—ฐ์‚ฐ
    def enqueue(self, item):
        self.data.append(item)
        
    # ๋ฐ์ดํ„ฐ ์›์†Œ ์‚ญ์ œ ์—ฐ์‚ฐ
    def dequeue(self):
        return self.data.pop(0)
    
    # ํ์˜ ๋งจ ์•ž ์›์†Œ ๋ฐ˜ํ™˜
    def peek(self):
        return self.data[0]

 

 

๋ฐฐ์—ด๋กœ ๊ตฌํ˜„ํ•œ ํ์˜ ์—ฐ์‚ฐ ๋ณต์žก๋„

๋ฐ์ดํ„ฐ ์‚ญ์ œ ์—ฐ์‚ฐ์€ ํ์˜ ๊ธธ์ด๊ฐ€ ๊ธธ์–ด์งˆ์ˆ˜๋ก ๊ทธ๋งŒํผ ์—ฐ์‚ฐ์ด ์˜ค๋ž˜๊ฑธ๋ฆฐ๋‹ค. ํ์˜ ๊ธธ์ด์— ๋น„๋ก€ํ•˜๋Š” ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค. ๋ฐฐ์—ด์˜ ๋งจ ์•ž์˜ ์›์†Œ๋ฅผ ๊บผ๋‚ด๋Š” ๊ฒƒ์„ ์ƒ๊ฐํ•ด๋ณด์ž. ๋งจ ์•ž ์›์†Œ๊ฐ€ ์‚ญ์ œ๊ฐ€ ๋˜๋ฉด ๊ทธ ๋’ค์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋“ค์ด ํ•˜๋‚˜์”ฉ ์•ž์œผ๋กœ ๋‹น๊ฒจ์„œ ์™€์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ์˜ ๊ธธ์ด๋งŒํผ ์—ฐ์‚ฐ์ด ์ผ์–ด๋‚œ๋‹ค.

 

 

 

 

์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋กœ ํ๋ฅผ ๊ตฌํ˜„

์ฝ”๋“œ์˜ ๊ตฌํ˜„์€ ์‰ฌ์šฐ๋‚˜ ์—ฐ์‚ฐ์˜ ๋ณต์žก๋„์— ๋Œ€ํ•ด์„œ๋„ ์ƒ๊ฐ์„ ํ•ด๋ณด์•„์•ผํ•œ๋‹ค.

class Node:

    def __init__(self, item):
        self.data = item
        self.prev = None
        self.next = None


class DoublyLinkedList:

    def __init__(self):
        self.nodeCount = 0
        self.head = Node(None)
        self.tail = Node(None)
        self.head.prev = None
        self.head.next = self.tail
        self.tail.prev = self.head
        self.tail.next = None


    def __repr__(self):
        if self.nodeCount == 0:
            return 'LinkedList: empty'

        s = ''
        curr = self.head
        while curr.next.next:
            curr = curr.next
            s += repr(curr.data)
            if curr.next.next is not None:
                s += ' -> '
        return s


    def getLength(self):
        return self.nodeCount


    def traverse(self):
        result = []
        curr = self.head
        while curr.next.next:
            curr = curr.next
            result.append(curr.data)
        return result


    def reverse(self):
        result = []
        curr = self.tail
        while curr.prev.prev:
            curr = curr.prev
            result.append(curr.data)
        return result


    def getAt(self, pos):
        if pos < 0 or pos > self.nodeCount:
            return None

        if pos > self.nodeCount // 2:
            i = 0
            curr = self.tail
            while i < self.nodeCount - pos + 1:
                curr = curr.prev
                i += 1
        else:
            i = 0
            curr = self.head
            while i < pos:
                curr = curr.next
                i += 1

        return curr


    def insertAfter(self, prev, newNode):
        next = prev.next
        newNode.prev = prev
        newNode.next = next
        prev.next = newNode
        next.prev = newNode
        self.nodeCount += 1
        return True


    def insertAt(self, pos, newNode):
        if pos < 1 or pos > self.nodeCount + 1:
            return False

        prev = self.getAt(pos - 1)
        return self.insertAfter(prev, newNode)


    def popAfter(self, prev):
        curr = prev.next
        next = curr.next
        prev.next = next
        next.prev = prev
        self.nodeCount -= 1
        return curr.data


    def popAt(self, pos):
        if pos < 1 or pos > self.nodeCount:
            raise IndexError('Index out of range')

        prev = self.getAt(pos - 1)
        return self.popAfter(prev)


    def concat(self, L):
        self.tail.prev.next = L.head.next
        L.head.next.prev = self.tail.prev
        self.tail = L.tail

        self.nodeCount += L.nodeCount

#################################################
class LinkedListQueue:

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

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

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

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

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

    def peek(self):
        return self.data.head.next.data
#################################################



def solution(x):
    return 0

 

 

 

 

 

 

์ฐธ๊ณ  - ํ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

from pythons.basic.queue import Queue

Q=Queue()

dir(Q)

 

๋ฐ˜์‘ํ˜•
๋Œ“๊ธ€