-
[Data Structure] ํ (Queue)Data Structure 2022. 2. 13. 19:08
์๋ ํ์ธ์!
์ด๋ฒ์๋ Queue์ ๋ํด์ ํฌ์คํ ํด๋ณด๋ ค๊ณ ํฉ๋๋ค!
1. Queue๋?
Queue๋ ํ์ชฝ ๋์์๋ง ์์์ ์ถ๊ฐ๊ฐ ์ด๋ฃจ์ด์ง๊ณ , ๋ค๋ฅธ ํ์ชฝ ๋์์๋ง ์์์ ์ ๊ฑฐ๊ฐ ์ด๋ฃจ์ด์ง๋ ์์ฐจํ๋ ๋ฆฌ์คํธ์ ๋๋ค.
์์์ ์ถ๊ฐ๊ฐ ์ด๋ฃจ์ด์ง๋ ์ชฝ์ rear, ์์์ ์ ๊ฑฐ๊ฐ ์ด๋ฃจ์ด์ง๋ ์ชฝ์ front๋ผ๊ณ ํฉ๋๋ค.
์ฆ, rear๋ก ์์๊ฐ ๋ค์ด์ค๊ณ , front๋ก ์์๊ฐ ๋๊ฐ๋ค๊ณ ์๊ฐํ์๋ฉด ๋ฉ๋๋ค.

Queue๋ ๊ฐ์ฅ ๋จผ์ ๋ค์ด์จ ์์๊ฐ ๊ฐ์ฅ ๋จผ์ ๋์ค๊ธฐ ๋๋ฌธ์ FIFO (First-In-First-Out) ๊ตฌ์กฐ์ ๋๋ค.
Queue ๋ํ Stack๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์์์ ์ถ๊ฐ/์ ๊ฑฐ ์๊ฐ๋ณต์ก๋๋ O(1)์ ๋๋ค.
์ ์ผ ์๊ณผ ๋ค์ ์๋ ์์๋ฅผ ํ์ธํ๋ ์๊ฐ๋ณต์ก๋ ๋ํ O(1)์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ Queue์ ์ ์ผ ์๊ณผ ๋ค๋ฅผ ์ ์ธํ ๋๋จธ์ง ์์๋ค์ ํ์ธ ๋๋ ๋ณ๊ฒฝ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
2. Queue ๊ตฌํํ๊ธฐ
Queue๋ฅผ ๊ตฌํํ๋ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
struct Queue<T> { private var queue: [T] = [] // queue๊ฐ ๋น์ด์๋์ง ํ์ธ var isEmpty: Bool { return queue.isEmpty } // queue์ front (์ ์ผ ์์ ์์ ํ์ธ) var front: T? { return queue.first } // queue์ rear (์ ์ผ ๋ค์ ์์ ํ์ธ) var rear: T? { return queue.last } // queue์ ์์ ๊ฐฏ์ var count: Int { return queue.count } // queue์ rear์ ์์ ์ถ๊ฐ mutating func enqueue(_ element: T) { queue.append(element) } // queue์ front์์ ์์ ์ ๊ฑฐ mutating func dequeue() -> T? { return isEmpty ? nil : queue.removeFirst() } }Queue ๋ํ ๋ค์ํ ์๋ฃํ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ํด Generic์ผ๋ก ์ ์ธํ์๊ณ ,
queue ๋ผ๋ ๋ฐฐ์ด์ ์์๋ฅผ ์ ์ฅํ์ฌ ์ฌ์ฉํ๋ฉด ๋๋ต๋๋ค!
var myQueue = Queue<Int>() myQueue.enqueue(0) myQueue.enqueue(1) myQueue.enqueue(2) print("front:", myQueue.front!) // 0 print("rear:", myQueue.rear!) // 2 print("count:", myQueue.count) // 3 myQueue.dequeue() // front์ธ 0์ dequeue myQueue.dequeue() // front์ธ 1์ dequeue print("front:", myQueue.front!) // 2 print("rear:", myQueue.rear!) // 2 myQueue.dequeue() // front์ธ 2๋ฅผ dequeue myQueue.dequeue() // nil print("count", myQueue.count) // 0์ ์ฝ๋์ ์คํ ๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ์ต๋๋ค.

์ถ๊ฐ๋ก,,
Swift๋ก ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ๋ฅผ ํ๋ค๋ณด๋ ์๊ฐ์ด๊ณผ๋ฅผ ๊ต์ฅํ ๋ง์ด ๊ฒช์์ต๋๋ค!
removeFirst()์ ์๊ฐ๋ณต์ก๋๊ฐ O(n)์ด๊ธฐ ๋๋ฌธ์, removeFirst()๋ฅผ ์ฌ์ฉํ๋ฉด ์๊ฐ์ด๊ณผ๊ฐ ๋๋ ๊ฒ ๊ฐ๋๋ผ๊ตฌ์.
๊ทธ๋์ removeFirst()๋ฅผ ์ฌ์ฉํ์ง ์๊ณ Queue๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ๋ ์ถ๊ฐํ์์ต๋๋ค!
struct AnotherQueue<T> { private var list1: [T] = [] // enqueue๋ฅผ ์ํ ๋ฐฐ์ด private var list2: [T] = [] // dequeue๋ฅผ ์ํ ๋ฐฐ์ด var isEmpty: Bool { return list1.isEmpty && list2.isEmpty } var count: Int { return list1.count + list2.count } var front: T? { if list2.isEmpty { return list1.first } else { return list2.last } } var rear: T? { if list2.isEmpty { return list1.last } else { return list2.first } } mutating func enqueue(_ element: T) { list1.append(element) } mutating func dequeue() -> T? { // list2๊ฐ ๋น์ด์์ ๋์๋ง list1์ ์์๋ค์ reversed()๋ก ๋ณต์ฌํด์ด if list2.isEmpty { list2 = list1.reversed() list1.removeAll() } return list2.popLast() } }์ฌ๊ธฐ์๋ ๋ฐฐ์ด์ 2๊ฐ ์ฌ์ฉํฉ๋๋ค!
๋ฐ๋ก enqueue๋ฅผ ์ํ ๋ฐฐ์ด list1๊ณผ dequeue๋ฅผ ์ํ ๋ฐฐ์ด list2์ธ๋ฐ์,
๋จผ์ enqueue ๋ฉ์๋๋ ์์์์ ๋ง์ฐฌ๊ฐ์ง๋ก list1์ ์์๋ฅผ ์ถ๊ฐํ๋ ์ญํ ์ ํฉ๋๋ค.
dequeue ๋ฉ์๋๊ฐ ์กฐ๊ธ ๋ค๋ฅธ๋ฐ์!
dequeue ๋ฉ์๋์์๋ list2๊ฐ ๋น์ด์์ ๋์๋ง list1 ์์๋ค์ reversed๋ก ๋ณต์ฌํด์ต๋๋ค.
๊ทธ ํ์ list1์ ๋น ์ํ๋ก ๋ง๋ค์ด์ค๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ผ๋ก list2์ ์์ ๊ฐฏ์์ ์๊ด์์ด ๊ฐ์ฅ ๋ง์ง๋ง ์์๋ฅผ popํด์ฃผ๋ฉด dequeue๊ฐ ์ด๋ฃจ์ด์ง๋๋ค.
removeFirst()๋ฅผ ์ฌ์ฉํ์ง ์๋ ๋ฐฉ๋ฒ์ด์ฃ !
๊ทธ๋ฆผ์ผ๋ก ์ค๋ช ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.

๊ทธ๋ ๊ธฐ ๋๋ฌธ์ front์ rear ์์ฑ๋ ๊ตฌํ ๋ฐฉ๋ฒ์ด ์ด์ง ๋ค๋ฅด์ง๋ง, ์ฌ์ฉ๋ฐฉ๋ฒ๊ณผ ์๋ฆฌ๋ ๋๊ฐ๋ค๋๊ฑฐ!!!
์ฌ๊ธฐ๊น์ง ์ค๋๋ Queue์ ๋ํด ์์๋ณด์๋๋ฐ์, ๊ธ ์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํ๊ณ ํผ๋๋ฐฑ์ ํญ์ ํ์์ ๋๋ค๐
'Data Structure' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Data Structure] ๊ทธ๋ํ์ ํธ๋ฆฌ (0) 2022.03.14 [Data Structure] ์คํ (Stack) (0) 2022.02.09 [Data Structure] Linked List (Feat. Array) (0) 2022.01.12