ํ(Queue)

์ด๊ฒฝ์„ญยท2022๋…„ 5์›” 6์ผ
0

Algorithm

๋ชฉ๋ก ๋ณด๊ธฐ
5/15

๐Ÿ‘‰ ํ(Queue)

์Šคํƒ๊ณผ ๊ฐ™์ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ผ๋Š” ๊ฐœ๋…์ด ํƒ„์ƒํ•  ๋•Œ๋ถ€ํ„ฐ ์‚ฌ์šฉ๋œ ๊ฐ€์žฅ ๊ณ ์ „์ ์ธ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.

FIFO(First-In-First-Out, ์„ ์ž…์„ ์ถœ)

https://www.programiz.com/dsa/queue

ํŒŒ์ด์ฌ์—์„œ ์Šคํƒ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฆฌ์ŠคํŠธ๊ฐ€ ํ์˜ ๋ชจ๋“  ์—ฐ์‚ฐ์„ ์ง€์›ํ•œ๋‹ค. ๋‹ค๋งŒ ๋ฆฌ์ŠคํŠธ๋Š” ๋™์ ๋ฐฐ์—ด๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์–ด ํ์˜ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ ํšจ์œจ์ ์ด์ง€ ์•Š๋‹ค.
( Array์—์„œ pop(0)์€ O(n)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค.)

๋”ฐ๋ผ์„œ ๋ฐํฌ(Deque)๋ผ๋Š” ๋ณ„๋„์˜ ์ž๋ฃŒํ˜•์„ ์‚ฌ์šฉํ•ด์•ผ ์ข‹์€ ํšจ์œจ์„๊ฐ€์ง„๋‹ค.

๐Ÿคš ๋ฐํ(Deque)๋ž€?
Deque๋Š” double-ended queue์˜ ์ค„์ž„๋ง๋กœ, ์•ž๊ณผ ๋’ค ์ฆ‰ ์–‘๋ฐฉํ–ฅ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๋งŒํ•œ๋‹ค.
์Šคํƒ๊ณผ ํ์˜ ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ๊ฐ€์กŒ๋‹ค.

  • ๋’ค(์˜ค๋ฅธ์ชฝ) ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€ ๋ฐ ์‚ญ์ œ
    ์ถ”๊ฐ€: append()
    ์‚ญ์ œ: pop()
    (O(1)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๋ฉฐ, ์Šคํƒ๊ณผ ๋™์ผํ•˜๋‹ค.)

  • ์•ž(์™ผ์ชฝ) ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€ ๋ฐ ์‚ญ์ œ
    ์ถ”๊ฐ€: appendleft()
    ์‚ญ์ œ: popleft()
    (O(1)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๋ฉฐ, ์œ„์—์„œ ์–ธ๊ธ‰ ํ–ˆ๋“ฏ์ด Array๋ณด๋‹ค ๋” ํšจ์œจ์ ์ธ ์—ฐ์‚ฐ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.)

์ฐธ์กฐ)https://jungeun960.tistory.com/148

โœ๏ธ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•œ ๊ตฌํ˜„

class QueueByArray:
	def __init__(self):
    	self.queue = []
    
    # ์ถ”๊ฐ€
    def push(self, value):
    	self.queue.append(value)
    
	# ์‚ญ์ œ
    def pop(self):
    	# ํ ์•ˆ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„ ๋•Œ์˜ ์˜ˆ์™ธ์ฒ˜๋ฆฌ
    	if not self.queue:
        	return None
            
    	# O(n)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค.
    	return self.queue.pop(0)
    
	# ์กฐํšŒ
    def peek(self):
    	return self.queue[0]
   	
    def is_empty(self):
    	if len(self.queue) == 0:
        	return True
        return False

โœ๏ธ ๋ฐํฌ(Deque)๋ฅผ ์ด์šฉํ•œ ๊ตฌํ˜„

class QueueByArray:
	def __init__(self):
    	self.queue = collections.deque()
    
    # ์ถ”๊ฐ€
    def push(self, value):
    	self.queue.push(value)
    
	# ์‚ญ์ œ
    def pop(self):
    	# ํ ์•ˆ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„ ๋•Œ์˜ ์˜ˆ์™ธ์ฒ˜๋ฆฌ
    	if not self.queue:
        	return None
            
    	# O(1)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค.
    	return self.queue.popleft()
    
	# ์กฐํšŒ
    def peek(self):
    	return self.queue[0]
   	
    def is_empty(self):
    	if len(self.queue) == 0:
        	return True
        return False

โœ๏ธ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•œ ๊ตฌํ˜„

class Node:
	def __init__(self, item, next):
    	self.item = item
        self.next = next
    
class QueueByLikedList:
	def __init__(self):
    	# front ์ดˆ๊ธฐํ™”
    	self.front = None
    
    # ์ถ”๊ฐ€    
    def push(self, value):
    	if not self.front:
        	self.front = Node(value, None)
            return
        
        node = self.front
        while node.next:
        	node = node.next
    	node.next = Node(value, None)
	
    # ์‚ญ์ œ
    def pop(self):
    	# ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„ ๋•Œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ
    	if self.front is None:
        	return None
        
        node = self.front
        self.front = self.front.next
        return node.item
    
    # ํ ๋น„์—ˆ๋Š”์ง€ ํ™•์ธ
    def is_empty(self):
       if not self.front:
           return True
       return False      

์ฐธ์กฐ)
ํŒŒ์ด์ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ธํ„ฐ๋ทฐ

0๊ฐœ์˜ ๋Œ“๊ธ€