[Data Structures] Queue - Array based implementation
Queue
Queue๋ ์์ฃผ ํํ ๊ฐ๋
์ด๋ค. ํธ์์ ์๋ฐํ ๋ ๊ฐ์ฅ ๋ง์ด ์ผ๋ ๋ง์ธ โ์ ์
์ ์ถโโฆ. ๋จผ์ ๋ค์ด์จ ๊ฒ ๋จผ์ ๋๊ฐ๋ค๋ ๋ป์ด๋ค.
์ค์ ๋ก Queue๋ FIFO์ ํํ๋ฅผ ๊ฐ์ง๋ค๊ณ ๋งํ๋๋ฐ, ์ด๊ฒ์ First in First out
์ด๋ ๋ฌธ์ฅ์ ์ฝ์๋ค. (์ ์
์ ์ถ..!)
Common Operations
Queue๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๋ค.
- Array๋ก ๊ตฌํํ๋ ๋ฐฉ๋ฒ
- Double Linked List๋ก ๊ตฌํํ๋ ๋ฐฉ๋ฒ
- ๋ง๋ฒํผ๋ก ๊ตฌํํ๋ ๋ฐฉ๋ฒ
- Stack์ผ๋ก ๊ตฌํํ๋ ๋ฐฉ๋ฒ
์ฌ๋ฌ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌํํ Queue๋ฅผ ํ์ธํด ๋ณผํ ๋ฐ ์ฐ์ ์ Queue์์ ๊ตฌํํด์ผ ํ๋ ํญ๋ชฉ๋ค์ ๋จผ์ ํ๋กํ ์ฝ๋ก ์ ์ํด๋๋ค.
protocol Queue {
associatedtype T
mutating func enqueue(_ element: T) -> Bool
mutating func dequeue() -> T?
var isEmpty: Bool { get }
var peek: T? { get }
}
Queue ํ๋กํ ์ฝ์ ์ ์ํ ๋ Generic Protocol์ ์ ์ํด์ ์ด๋ค ํ์ ์ด๋ ๋ฐ์์ ์ฌ์ฉํ ์ ์๋๋ก ๋ง๋ค์๋ค.
- enqueue: ์ด๋ค ๊ฐ์ Queue์ ๊ฐ์ฅ ๋ค์ ๋ฃ๋ ๋ฉ์๋
- dequeue: Queue์ ๊ฐ์ฅ ์์ ๊ฐ์ ์ ๊ฑฐํ๋ ๋ฉ์๋
- isEmpty: Queue๊ฐ ๋น์ด์๋์ง ํ์ธ
- peek: Queue์ ๊ฐ์ฅ ์ ๋ถ๋ถ์ ์์๋ฅผ ํ์ธ
Array๋ก Queue ๊ตฌํํด๋ณด๊ธฐ
Array๋ก Queue๋ฅผ ๊ตฌํํด๋ณด์. ์ฐ์ QueueArray
๋ผ๋ ๊ตฌ์กฐ์ฒด๋ฅผ ์์ฑํด ์์ ๋ง๋ค์ด๋์๋ Queue ํ๋กํ ์ฝ์ ์ฑํํ๋ค.
struct QueueArray<T>: Queue {
private var array: [T] = []
}
๊ตฌ์กฐ์ฒด ๋ด๋ถ์์ ์ฌ์ฉํ array๋ฅผ ํ๋ ์ ์ธํด๋์๋ค. ์ด์ Queue๋ฅผ ์ฑํํ์ผ๋ ํ์ํ ๋ฉ์๋๋ค์ ๋ง์ ๊ตฌํํ๋ค.
isEmpty, peek ๊ตฌํ
var isEmpty: Bool {
array.isEmpty
}
var peek: T? {
array.first
}
- isEmpty๋ ๋ฐฐ์ด์ด ๋น์๋์ง๋ฅผ, peek์ ๋ฐฐ์ด์ ๊ฐ์ฅ ์ฒซ ์์๋ฅผ ๋ฐํํ๋ค.
enqueue ๊ตฌํ
mutating func enqueue(_ element: T) -> Bool {
array.append(element)
return true
}
๋ฐฐ์ด๋ก ๊ตฌํํ๋ Queue์์ enqeue๋ฅผ ๊ตฌํํ๋๊ฒ์ ๊ฐ๋จํ๋ค. array์ ๊ฐ์ฅ ๋ง์ง๋ง์ ์์๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ append๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
์ด๋ enqueueํ๋ ์๊ฐ๋ณต์ก๋๋ O(1)์ด๋ค. ์๋ํ๋ฉด ๋ฐฐ์ด์ ๋งจ ๋ค์๊ฐ ๋น์ด์๊ธฐ ๋๋ฌธ์ด๋ค.(๋ผ๊ณ ํ๋ค.) ํ ๋น๋ ๋งํผ์ ๋ฐฐ์ด์ด ๊ฝ ์ฐจ์๋ ์ํ์์ ์๋ก์ด ์์๊ฐ ๋ค์ด์ค๋ฉด ๊ทธ๋์์ผ ๋ฐฐ์ด์ ์ฌ์ด์ฆ๊ฐ ์ฌ์กฐ์ ๋๋ค.
๋ฆฌ์ฌ์ด์ง์ O(n)์ธ ๋์์ธ๋ฐ, ๋ฆฌ์ฌ์ด์ง์ ํ๋ ์์ ์ ์๋ก์ด ํฌ๊ธฐ์ ๋ฐฐ์ด์ด ์๊ฒจ๋๊ณ , ๊ทธ ๋ฐฐ์ด์ ์๋ ์๋ ๋ฐฐ์ด์ ์์๋ฅผ ์ฎ๊ฒจ๊ฐ๋ ์ผ์ ํ๊ธฐ ๋๋ฌธ์ด๋ค. ํ์ง๋ง ๋ฐฐ์ด์ ๋ฆฌ์ฌ์ด์ง์ด ํ์ํ ๋๋ง๋ค ์๋ง ๋๋ฐฐ์ฉ ํฌ๊ธฐ๊ฐ ๋์ด๋๊ธฐ ๋๋ฌธ์(?) ์์ฃผ ์ผ์ด๋๋ ์ผ์ด ์๋๊ณ ๊ทธ๋์ enqueue์ ๋ณต์ก๋๋ฅผ O(1)๋ก ์๊ฐํ๋ค.
dequeue
dequeue๋ ๋งจ ์์์ ์์๋ฅผ ๋นผ์ค๋ ๋์์ด๋ค. ๋ฐฐ์ด์ด ๋น์ด์๋ค๋ฉด nil์ ๋ฐํํ๊ณ ๊ฐ์ด ์๋ค๋ฉด removeFirst๋ฅผ ์ฌ์ฉํด ๋ฐฐ์ด์์ ๊ฐ์ ์ ๊ฑฐํ๋ค.
mutating func dequeue() -> T? {
return isEmpty ? nil : array.removeFirst()
}
dequeue๋ ํญ์ O(n)์ ์๊ฐ๋ณต์ก๋๊ฐ ๋๋๋ฐ, ์ด๊ฒ์ ๋ฐฐ์ด์ ๋งจ ์ ์์๋ฅผ ์ ๊ฑฐํ๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐฐ์ด์ ๋งจ ์ ์์๋ฅผ ์ ๊ฑฐํ๋ฉด ๋๋จธ์ง ์์๋ค์ ํ์นธ์ฉ ์์ผ๋ก shiftํด์ฃผ์ด์ผ ํ๊ธฐ ๋๋ฌธ์ O(n)์ผ๋ก ํ๊ธฐํ๋ค.
์คํ ๊ฒฐ๊ณผ ๋ฐ ๋ณต์ก๋ ์ ๋ฆฌ
- ์คํ ๊ฒฐ๊ณผ
- ๋ณต์ก๋
Leave a comment