์ค์ํํธ๋ก ๊ตฌํํ๋ ์๋ฃ๊ตฌ์กฐ 3: ํ(Queue)
ํ (Queue)
ํ๋ FIFO(First In First Out)์ ํน์ฑ์ ๊ฐ์ง๋ ์๋ฃ๊ตฌ์กฐ์ ๋๋ค. ์ด๋ฆ์ฒ๋ผ ๊ฐ์ฅ ๋จผ์ ๋ฃ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ฅ ๋จผ์ ๊บผ๋ด๋ ํน์ง์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ค์ํํธ์์๋ ๋ฐฐ์ด์์ removeFirst๋ฅผ ์ง์ํ๊ธด ํ์ง๋ง,
์ด๋ ๊ฒ ์๊ฐ๋ณต์ก๋๋ O(n)์ด๋ผ์, ๋์๋ง FIFO์ผ ๋ฟ, ์ญ์ ์ O(1)์ ๋ณด์ฅํ๋ ํ๊ฐ ๋ ์๋ ์์ต๋๋ค. ๊ทธ๋์ ์ด ํฌ์คํธ์์๋ ๋งํฌ๋ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํด์ ํ๋ฅผ ๊ตฌํํ๋๋ก ํ๊ฒ ์ต๋๋ค.
๋ผ๋ ๋ง๋ค๊ธฐ
var list = TwoPointerLinkedList<T>()
init(_ elements: [T] = []) {
for element in elements {
list.add(node: Node(data: element))
}
}
var count : Int {
return list.count
}
var isEmpty : Bool {
return list.head == nil
}
var front: T? {
return list.front?.data
}
var back: T? {
return list.back?.data
}
๋จผ์ ๊ธฐ๋ณธ์ ์ธ ํ๋กํผํฐ์ ์์ฑ์๋ ์ด๋ ๊ฒ ๊ตฌ์ฑํ์ต๋๋ค. TwoPointerLinkedList๋ head, tail ๋ ๊ฐ์ ํฌ์ธํฐ๋ก ๋งํฌ๋ ๋ฆฌ์คํธ์ ๊ฐ์ฅ ์๊ณผ ๋ค๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ํ๋ ๋งํฌ๋ ๋ฆฌ์คํธ ์๋ฃ๊ตฌ์กฐ์ ๋๋ค.
์์ฑ์์์๋ ๋ง์ฝ์ ๋ฐฐ์ด์ด ํ ๋ฒ์ ๋ค์ด์ค๋ฉด ์์๋๋ก ๋งํฌ๋ ๋ฆฌ์คํธ์ ์ถ๊ฐํด์ฃผ๋ ๋ก์ง์ ๋ฃ์ด๋์๊ณ , count ํ๋กํผํฐ๋ ๋ ธ๋์ ๊ฐ์๋ฅผ, isEmpty ํ๋กํผํฐ๋ head ํฌ์ธํฐ๊ฐ ๋น์ด์๋์ง๋ฅผ ํตํด ๊ฐ์ ๋ฐํํ๋๋ก ๊ตฌ์ฑํ์ต๋๋ค.
๋งํฌ๋ ๋ฆฌ์คํธ
ํ๋ฅผ ๋ง๋ค๊ธฐ ์ํด์ ๋ง๋ ๋งํฌ๋ ๋ฆฌ์คํธ๋ ์ด๋ ์ต๋๋ค! ๋งํฌ๋ ๋ฆฌ์คํธ์ ๊ตฌํ๊ณผ ๋์๋ฐฉ์์ https://jeonyeohun.tistory.com/320 ์ฌ๊ธฐ์ ๋ ์์ธํ ์ค๋ช ๋์ด ์์ต๋๋ค!
import Foundation
struct TwoPointerLinkedList<T> {
var head: Node<T>?
var tail: Node<T>?
var count: Int = 0
var front: Node<T>? {
return head
}
var back: Node<T>? {
return tail
}
mutating func add(node: Node<T>) {
if self.head == nil {
self.head = node
self.tail = node
} else {
self.tail?.next = node
self.tail = node
}
self.count += 1
}
mutating func removeFirst() -> Node<T>? {
guard head != nil else {
self.clear()
return nil
}
let deleted = self.head
self.head = head?.next
self.count -= 1
if head == nil {
self.clear()
}
return deleted
}
mutating func clear() {
self.head = nil
self.tail = nil
}
}
๊ธฐ์กด ๋งํฌ๋ ๋ฆฌ์คํธ์ ๊ฑฐ์ ๋์ผํ์ง๋ง, clear ๋ฉ์๋๋ฅผ ํตํด ๋ชจ๋ ๋ ธ๋๋ฅผ ํ๋ฒ์ ํด์ ํ ์ ์๊ฒ ํ๊ณ , ๋ ธ๋์ ๊ฐ์๋ฅผ ํ์์์ด ํ์ธํ ์ ์๋๋ก ํ๋ count ํ๋กํผํฐ์ ๊ฐ์ฅ ์ ๋ ธ๋์ ๊ฐ์ฅ ๋ค ๋ ธ๋๋ฅผ ์ฝ๊ฒ ํ์ธํ ์ ์๋ front, back ํ๋กํผํฐ๋ฅผ ์ถ๊ฐํ์ต๋๋ค.
์ฝ์ (push) - O(1)
์ฝ์ ์ฐ์ฐ์ ๊ธฐ์กด์ ๋งํฌ๋ ๋ฆฌ์คํธ์ ์ถ๊ฐ ์ฐ์ฐ์ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
mutating func push(_ element: T) {
list.add(node: Node(data: element))
}
์ด๋ฒ์๋ ํ๋ฅผ ์ข ๋ ๋ฒ์ฉ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๊ฒ, ๋ ธ๋๋ฅผ ์ธ๋ถ์์ ๋ง๋ค์ด์ ๋ฃ๋ ๊ฒ์ด ์๋๋ผ ํ ์๋ฃ๊ตฌ์กฐ์์ ์์ฒด์ ์ผ๋ก ๋ง๋ค์ด์ ๋งํฌ๋ ๋ฆฌ์คํธ์ ์ฃผ์ ํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌ์ฑํด๋ณด์์ต๋๋ค.
๋ฆฌ์คํธ ๋ด๋ถ์๋,
mutating func add(node: Node<T>) {
if self.head == nil {
self.head = node
self.tail = node
} else {
self.tail?.next = node
self.tail = node
}
self.count += 1
}
์ด๋ ๊ฒ ์๋ก์ด ๋ ธ๋๋ฅผ tail ๋ค์ ๋ถ์ฌ์ฃผ๊ฑฐ๋, ๋ฆฌ์คํธ๊ฐ ๋น์ด์๋ ๊ฒฝ์ฐ์๋ ์ถ๊ฐํด์ฃผ๋ ๋ก์ง๊ณผ ๋ ธ๋์ ๊ฐ์๋ฅผ ๋๋ ค์ฃผ๋ ๋ก์ง์ด ๋ค์ด๊ฐ์์ต๋๋ค. ๋ณ๋์ ํ์๊ณผ์ ์์ด tail๋ก ์ฐพ์๊ฐ ๋ค์ ๋ ธ๋๋ฅผ ์ถ๊ฐํด์ฃผ๋ ๋ฐฉ์์ด๊ธฐ ๋๋ฌธ์ O(1)์ ์๊ฐ๋ณต์ก๋๊ฐ ๋ณด์ฅ๋ฉ๋๋ค.
์ญ์ (pop) - O(1)
์ญ์ ์ฐ์ฐ์ ๋งํฌ๋ ๋ฆฌ์คํธ์์ ๊ฐ์ฅ ์ ๋ ธ๋๋ฅผ ๋ฐํํ๊ณ ์ง์ฐ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํ๋์ด ์๋๋ฐ์,
์ด๋ ๊ฒ ๋ฆฌ์คํธ๊ฐ ์์ ๋,
ํ์ฌ head ๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ์ ๋ณ์์ ์์๋ก ์ ์ฅํด ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋์ง ์๋๋ก ๊ฐํ ์ฐธ์กฐ๋ฅผ ํด์ฃผ๊ณ ,
head ํฌ์ธํฐ๋ฅผ ํ ์นธ ์์ผ๋ก ์ด๋์์ผ์ ๋ฆฌ์คํธ์์ ๊ฐ์ฅ ์์ ์๋ ๋ ธ๋๋ฅผ ์ ์ธ์์ผ์ค๋๋ค. ๊ทธ๋ฆฌ๊ณ ์์๋ก ์ ์ฅํ๋ ๋ ธ๋๋ฅผ ๊ทธ๋๋ก ๋ฐํํ๋ฉด pop ์ฐ์ฐ์ด ์์ฑ๋ฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ํ์ ์์ด ๊ณง๋ฐ๋ก ์ฒซ๋ฒ์งธ ๋ ธ๋๋ฅผ ์ง์ฐ๊ณ ๋ฐํํ๋ O(1)์ ์๊ฐ๋ณต์ก๋๊ฐ ๋ณด์ฅ๋ฉ๋๋ค.
mutating func removeFirst() -> Node<T>? {
guard head != nil else {
self.clear()
return nil
}
let deleted = self.head
self.head = head?.next
self.count -= 1
if head == nil {
self.clear()
}
return deleted
}
์ ์ฒด ์ฝ๋
์๋ฃ๊ตฌ์กฐ ์๋ฆฌ์ฆ์ ์ฝ๋๋ค์ ์ด ๋ ํฌ์์ ๋ชจ๋ ํ์ธํ ์ ์์ด์!
'๐ฎ ์จ-์์ค > ๐ฆด ์๋ฃ๊ตฌ์กฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote