๐Ÿงฉ ํ(Queue) : ๋ฐ์ดํ„ฐ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์Œ“์•„ ๋‘๊ณ , ๋จผ์ € ์ ์žฌ๋œ ๋ฐ์ดํ„ฐ๋ถ€ํ„ฐ ๊บผ๋‚ด์“ธ ์ˆ˜ ์žˆ๋„๋ก ์ž๋ฃŒ๋ฅผ ์ €์žฅํ•ด๋‘” ํ˜•ํƒœ

  • enqueue : ๋ฐ์ดํ„ฐ์‚ฝ์ž… + dequeue : ๋ฐ์ดํ„ฐ์ถ”์ถœ
  • ์„ ์ž…์„ ์ถœ (FIFO, First in First out)
    • ๐Ÿ”„ ์Šคํƒ : ํ›„์ž…์„ ์ถœ (LIFO, Last in First out)

1 ์‹ค์ƒํ™œ์—์„œ ํ

๐Ÿ“Ž ์›น์„œ๋ฒ„ ์ ‘์†์ž๊ด€๋ฆฌ

  • ์›น์„œ๋ฒ„ : ๋™์‹œ์ˆ˜์šฉ ๊ฐ€๋Šฅ ์ ‘์†์ž ์ˆ˜ ์ œํ•œ์  โ›”๏ธ
๊ตฌ๋ถ„๊ฒฐ๊ณผ
ํ ์ ์šฉ โœ…์ ‘์†์ž โ†’ ๋Œ€๊ธฐ์—ด, ์ˆœ์ฐจ์ ์œผ๋กœ Client Request ์ฒ˜๋ฆฌ
ํ ์ ์šฉ โŒ์ ‘์†์ž > ๋™์‹œ์ˆ˜์šฉ๊ฐ€๋Šฅ์ธ์› โ†’ ์„œ๋ฒ„๋‹ค์šด

2 ํ ํ˜•ํƒœ

๐Ÿงฉ ํ ํ˜•ํƒœ : ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” ์ž…๊ตฌ์™€ ๋‚˜๊ฐ€๋Š” ์ถœ๊ตฌ๊ฐ€ ๋”ฐ๋กœ ์กด์žฌ

  • ์ž…/์ถœ๊ตฌ ๋”ฐ๋กœ ์กด์žฌ โ†’ ๋จผ์ €๋“ค์–ด๊ฐ„ ์ž๋ฃŒ๊ฐ€ ๋จผ์ €๋‚˜์˜ค๋Š” ๊ตฌ์กฐ โœ…

1๏ธโƒฃ ์„ ํ˜• ํ (Linear Queue)

  • ๋ฐ์ดํ„ฐ ๋นˆ์ž๋ฆฌ ๋ฐœ์ƒ โ†’ ๋นˆ์ž๋ฆฌ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ๋‹ค์Œ๋ฐ์ดํ„ฐ๊ฐ€ ์œ„์น˜ ์ด๋™์„ ํ•ด์•ผํ•จ ๐Ÿšจ
  • ์ œํ•œ๋œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋นˆ์ž๋ฆฌ โ›”๏ธ

2๏ธโƒฃ ์›ํ˜• ํ (Circular Queue)

  • ์„ ํ˜• ํ์˜ ๋์„ ์ฒ˜์Œ์œผ๋กœ ์—ฐ๊ฒฐํ•ด๋†“์€ ํ˜•ํƒœ
  • ๋นˆ์ž๋ฆฌ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ โŒ
  • ๋นˆ์ž๋ฆฌ๋ฅผ ๋‘์–ด๋„ ์ œํ•œ๋œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„ ํ™œ์šฉ๊ฐ€๋Šฅ โœ…

3 ํ ํŠน์ง•

  • ๊ฐ€์žฅ๋จผ์ € ๋“ค์–ด๊ฐ„ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ€์žฅ๋จผ์ € ๋‚˜์˜ด
    • ์„ ์ž…์„ ์ถœ(FIFO)
  • front : ํ์—์„œ ๊ฐ€์žฅ ์•ž โ†’ ์ฒ˜๋ฆฌ(์‚ญ์ œ)
  • rear : ํ์—์„œ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ โ†’ ์‚ฝ์ž…

4 ํ ์›๋ฆฌ

  • ์„ ํ˜• ํ : rear๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๊ณต๊ฐ„ ๋งˆ์ง€๋ง‰ โ†’ ๋”์ด์ƒ ๋ฐ์ดํ„ฐ์‚ฝ์ž… ๋ถˆ๊ฐ€ โ›”๏ธ
    • deQueue๋กœ ์ธํ•ด ๋ฐœ์ƒํ•œ ๋นˆ ๊ณต๊ฐ„๋„ ํ™œ์šฉ ๋ถˆ๊ฐ€ โ›”๏ธ
  • ์›ํ˜• ํ : ๊ณ„์†ํ•ด์„œ ๋ฐ์ดํ„ฐ ์‚ฝ์ž… ๊ฐ€๋Šฅ (์œ„์˜ ๋‹จ์  ํ•ด๊ฒฐ) โœ…

5 ํ ๊ตฌํ˜„

1๏ธโƒฃ ํ ์ƒ์„ฑ

>>> queue = [None, None, None] # ๋ฏธ๋ฆฌ๊ณต๊ฐ„์ง€์ •
>>> front = rear = -1

2๏ธโƒฃ enQueue

๐Ÿ“ ์ฒซ๋ฒˆ์งธ๋ฐ์ดํ„ฐ
>>> rear += 1 # rear ์œ„์น˜ +1์นธ ์ด๋™
>>> queue[rear] = 'python'

๐Ÿ“ ๋‘๋ฒˆ์งธ๋ฐ์ดํ„ฐ
>>> rear += 1
>>> queue[rear] = 'java'

๐Ÿ“ ๋ฐ์ดํ„ฐ์ถœ๋ ฅ
>>> for i in range(0, len(queue), 1):
		print(queue[i], end = ' ')
        # python java

3๏ธโƒฃ deQueue

>>> front += 1 # front ์œ„์น˜ +1์นธ ์ด๋™
>>> data = queue[front] # queue[0]
>>> queue[front] = None # none์ฒ˜๋ฆฌ
>>> print(data) # python

>>> front += 1 # front ์œ„์น˜ +1์นธ ์ด๋™
>>> data = queue[front] # queue[1]
>>> queue[front] = None # none์ฒ˜๋ฆฌ
>>> print(data) # java

6 ํ ํ•จ์ˆ˜๊ตฌํ˜„

1๏ธโƒฃ enQueue

๐Ÿ“ ํ๊ฐ€ ๊ฝ‰์ฐผ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ํ•จ์ˆ˜
>>> def isQueueFull():
		global SIZE, queue, front, rear
        
        if (rear == SIZE - 1):
        	return True
        else:
        	return False

๐Ÿ“ ๋ฐ์ดํ„ฐ๋„ฃ๋Š” enQueue ํ•จ์ˆ˜
>>> def enQueue(data):
		global SIZE, queue, front, rear
        
        if (isQueueFull()):
        	print("ํ๊ฐ€ ๊ฝ‰ ์ฐผ์Šต๋‹ˆ๋‹ค.")
            return
        
        rear += 1
        queue[rear] = data

2๏ธโƒฃ deQueue

๐Ÿ“ ํ๊ฐ€ ๋น„์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ํ•จ์ˆ˜
>>> def isQueueEmpty():
		global SIZE, queue, front, rear
        
        if (front == rear):
        	return True
        else:
        	return False

๐Ÿ“ ๋ฐ์ดํ„ฐ๋นผ๋Š” deQueue ํ•จ์ˆ˜
>>> def deQueue():
		global SIZE, queue, front, rear
        
        if (isQueueEmpty()):
        	print("ํ๊ฐ€ ๋น„์—ˆ์Šต๋‹ˆ๋‹ค.")
            return None
        
        front += 1
        data = queue[front]
        
        queue[front] = None
        return data

๐Ÿ“ ํ ๋ฐ์ดํ„ฐ ์ถœ๋ ฅํ•˜๋Š” ํ•จ์ˆ˜
>>> def checkQueue():
		for i in range(0, len(queue), 1):
        	print(queue[i], end = ' ')

3๏ธโƒฃ Peek ํ•จ์ˆ˜

๐Ÿ“ peek ํ•จ์ˆ˜
>>> def peek():
		global SIZE, queue, front, rear
        if (isQueueEmpty()):
        	print("ํ๊ฐ€ ๋น„์—ˆ์Šต๋‹ˆ๋‹ค.")
            return None
        return queue[(front + 1) % SIZE] # front ์œ„์น˜ +1์นธ

7 ์›ํ˜•ํ ํ•จ์ˆ˜๊ตฌํ˜„

๐Ÿ“ ์›ํ˜•ํ ๋‹ค ์ฐผ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ํ•จ์ˆ˜
>>> def isQueueFull():
		global SIZE, queue, front, rear

    	if ((rear + 1) % SIZE == front): # rear๊ฐ€ ๋งˆ์ง€๋ง‰์นธ์— ์žˆ๋Š”์ƒํƒœ
        	return True
    	else:
        	return False

๐Ÿ“ ์›ํ˜•ํ ๋ฐ์ดํ„ฐ๋„ฃ๋Š” enQueue ํ•จ์ˆ˜
>>> def enQueue(data):
    	global SIZE, queue, front, rear
    
    	if (isQueueFull()):
        	print("ํ๊ฐ€ ๊ฝ‰ ์ฐผ์Šต๋‹ˆ๋‹ค.")
        	return
    
    	rear = (rear + 1) % SIZE # rear ํ•œ์นธ ์˜ฎ๊ธด ํ›„
    	queue[rear] = data

๐Ÿ“ ์›ํ˜•ํ ๋ฐ์ดํ„ฐ๋นผ๋Š” deQueue ํ•จ์ˆ˜
>>> def deQueue():
    	global SIZE, queue, front, rear

    	if (isQueueEmpty()):
        	print("ํ๊ฐ€ ๋น„์—ˆ์Šต๋‹ˆ๋‹ค.")
        	return None
    
    	front = (front + 1) % SIZE
    	data = queue[front]

    	queue[front] = None
    	return data

8 ์‹œ๊ฐ„๋ณต์žก๋„

ํ•ญ๋ชฉ์กฐํšŒ์‚ฝ์ž…์‚ญ์ œ
ํ(Queue)O(n)O(1)O(1)
  • ํ ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰ ์‹œ, โ†’ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋œ ๋ชจ๋“  ์ง€์ ์„ ์ฐจ๋ก€๋กœ ์ˆœํ™˜ํ•ด์•ผํ•˜๋ฏ€๋กœ ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜๋งŒํผ O(n) ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ๊ฑธ๋ฆผ
profile
๐Ÿฐ I'm Sunyeon-Jeong, mallang

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