
๐ swift๋ก stack ์๋ฃ๊ตฌ์กฐ๋ฅผ ๊ตฌํํด๋ณด์!!!
๋จผ์ ๋ค์ด์จ๊ฒ ๋์ค์ ๋๊ฐ๋ค. (First In, Last Out: FILO)
ํน์ ๋์ค์ ๋ค์ด์จ๊ฒ ๋จผ์ ๋๊ฐ๋ค! (Last In, First Out: LIFO)
๊ฐ์ฅ ๋จผ์ ๋ค์ด๊ฐ ์์๋ ๋ฐ์ ๊น๋ ค์ ๊ฐ์ฅ ๋์ค์ ๋์จ๋ค. ์ฑ ์ ์ธต์ธต์ด ์์๋๋ฉด ์๋์ชฝ ์ฑ ์ ๊บผ๋ด๋ ค๋ฉด ๊ฐ์ฅ ์์ ์ฑ ๋ถํฐ ๊บผ๋ด์ผ ํ๋ค๋ ๊ฒ์ ์๊ฐํด๋ณด์.
์คํ ์๋ฃ๊ตฌ์กฐ๊ฐ ํ๋ ์ญํ ์ ๋งจ ๋ค์ ์๋ ์์๋ฅผ ๋นผ๊ฑฐ๋(pop) ํ์ธํ๊ณ (top), ์๋ก์ด ์์๋ฅผ ์ถ๊ฐํ๋(push) ๊ฒ์ด๋ค. ์ด 3๊ฐ์ง ๊ธฐ๋ฅ์ O(1)๋ก ์ฒ๋ฆฌ๋๋ฉฐ ๊ฐ์ฅ ํต์ฌ ์ญํ ์ด๋ค. ์คํ์ ์ค๊ฐ์ ์๋ ์์๋ฅผ ํ์ธํ ์๋ ์์ง๋ง ๊ทธ๋ฐ ๊ฒ์ ๋ณดํต ์คํ์ โ๋ฐฐ์ด'๋ก ๋ง๋ค์ด์ โ๋ฐฐ์ด'์ ๊ธฐ๋ฅ์ ๊ฐ์ ธ๋ค ์ฐ๋ ๊ฒ์ด์ง ์คํ ์์ฒด๊ฐ ๊ฐ์ง๋ ๊ธฐ๋ฅ์ ์๋๋น.
push
์๋ก์ด ์์๋ฅผ ๋งจ ๋์ ์ถ๊ฐํ๋ค.
pop
๋งจ ๋์ ์์๋ฅผ ์ ๊ฑฐํ๋ค.
top (ํ์ Peek)
์คํ์ ๊ตฌํํ๋ ค๋ฉด ์๋ก์ด ๊ฐ์ด ๋ค์ด๊ฐ ์์น, ์ฆ ๋ง์ง๋ง ์์๊ฐ ์๋ ๊ณณ์ ์์์ผ ํ๋ค. ๊ทธ๋์ผ ์๋ก ๊ฐ๋ ์ถ๊ฐํ๊ณ , ์ ๊ฑฐ๋ ํ ์ ์๋ค. ์ด๋ฅผ pos ๋ผ๋ ์ด๋ฆ์ ๋ณ์๋ก ๊ตฌํํ์~
๋ ํผ๋ฐ์ค๋ฅผ ์ฌ๋ฌ๊ฐ ์ฐพ์๋ดค๋๋ฐ, ๋ค๋ค struct๋ก ๊ตฌํํ๋๋ผ. ์ด์ ๊ฐ ์๋๊ฑด๊ฐ? ๊ทธ๊ฑฐ์ ๋ํ ๋ต์ ์์ง ๋ชป์ฐพ์๋ค. swift์๋ class ๊ฐ ์๋๋ฐ ๋ค๋ค struct๋ฅผ ์ด๋ค. swift์์ struct๋ฅผ ๋ ๋ง์ด ์ด๋ค๋ ๊ฑด ์๊ณ ์์์ง๋ง ์์ง๊น์ง ์์ธ์ง๋ ๋ชจ๋ฅด๊ฒ ๋ค. ์๋ฌดํผโฆ
push, pop, top์ pos ๋ณ์๋ฅผ ์ฌ์ฉํด์ ๋ง๋ค์ด๋ณด์. ์ด ๋ฐฉ๋ฒ์ ๋ค๋ฅธ ์ธ์ด์๋ ์ ์ฉํ ์ ์๋ค!
๐ดย ์ ์ฒด์ฝ๋
var max_size = 10005
var items = [String?](repeating: nil, count: max_size)
var pos: Int = 0
// push
func push(_ item: String) {
items[pos] = item
pos += 1
}
// pop
func pop() -> String? {
pos -= 1
return items[pos]
}
// top
func top() -> String? {
return items[pos-1]
}
// --- ์ฌ์ฉ๋ฒ ---
push("hi")
push("my")
push("name")
push("is")
push("swift.")
print(items) // [Optional("hi"), Optional("my"), Optional("name"), Optional("is"), Optional("swift."), nil, ... , nil]
pop() // Optional("swift.")
pop() // Optional("is")
top() // Optional("name")
๋ฐฐ์ด์ ํฌ๊ธฐ๋ฅผ ์ค์ ํ๊ณ pos๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฐ์ด์ผ๋ก ์คํ์ ๊ตฌํํ์๋ค. ๊ทธ๋ฌ๋ ๋๋ ์ด๊ฒ ์ข์ ์ฝ๋๋ผ๊ณ ์๊ฐํ์ง ์๋๋ค. ๋ฌผ๋ก ์ด๋ ๊ฒ ๊ตฌํํ๋๊ฒ ํ๋ฆฐ ๊ฒ์ ์๋์ง๋ง ๊ฐ๊ฐ์ ์ธ์ด์ ํน์ฑ์ ๋ง๊ฒ ๊ตฌํํ๋๊ฒ ๋ ์ข์ง ์์๊น ํ๋ค. python๋, C++๋ ์์ ์ฝ๋ ํ์์ผ๋ก ๋ชจ๋ ๊ตฌํํ ์ ์๋ค.
swift์ ์ธ์ด์ ํน์ง์ ๋ง๊ฒ ์ ๊ณตํด์ฃผ๋ ๊ธฐ๋ณธ ํจ์๋ฅผ ์ด์ฉํด์ ์ถฉ๋ถํ ์คํ์ ๊ตฌํํ ์ ์๋ค. ๊ทธ๋ฌ๋ ๊ธฐ๋ณธ์ ์ธ ์คํ์ ์ฑ์ง์ ์ดํดํ๊ธฐ ์ํด ์์ ๊ฐ์ด ๊ตฌํํด๋ณด์๋ค.
ํ์ํ๋ค๋ฉด pos ์์ด ์๋์ (2),(3) ์ฒ๋ผ ๊ตฌํํ ์๋ ์๋ค.
(2)๋ฒ๊ณผ (3)๋ฒ์ ๊ตฌํ์ ๋ชจ๋ ๊ตฌ์กฐ์ฒด ์์ ๋ฉ์๋์ ๋ณ์๋ฅผ ์ ์ํ์ฌ ์ฌ์ฉํ๊ณ ์๋ค. ๊ทธ๋ฌ๋ ๊ตฌ์กฐ์ฒด ์์ด ์์ฒ๋ผ ๋ฒ๊ธฐ๊ณ ๊ตฌํํ ์๋ ์๋ค!!
๋์ ์ฐจ์ด์ ์ ์๊ณ ์ ์ ํ๊ฒ ์ฌ์ฉํ๋ฉด ๋๋ค.
๋ฐฐ์ด์ ์ด์ฉํ์ฌ ์คํ์ ๊ตฌํํ๋ค. ์ด๋ ์๋ก์ด item์ ๋ฐฐ์ด์ ๋์ ์ถ๊ฐํ๊ณ , ์ญ์ ํ๋ค.
์ฌ๊ธฐ์๋ pos ๋ณ์๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค.
โ๏ธย ๊ตฌ์กฐ์ฒด ์ ์ธ
struct Stack {
var items: [String] = []
}
Stack ์ด๋ผ๋ ์ด๋ฆ์ผ๋ก ๊ตฌ์กฐ์ฒด(struct)๋ฅผ ์ ์ธํ๊ณ , ๋ด๋ถ์ ๋ฐฐ์ด(array)์ ํ๋กํผํฐ(property)๋ก ์์ฑํ๋ค. items๋ฅผ ๊ตฌ์กฐ์ฒด ๋ด๋ถ์์๋ง ์ธ ์์ ์ด๋ผ๋ฉด private ํค์๋๋ฅผ ๋ถ์ฌ์ฃผ๋๋ก ํ์. ์ฉ๋์ ๋ง๊ฒ ์ ์ ํ ํค์๋๋ฅผ ๋ถ์ฌ์ฃผ์.
โ๏ธย push
// 1
mutating func push(_ item:String) {
// 2
self.items.append(item)
}
์๋ก์ด item์ ์คํ์ ์ถ๊ฐํ๋ push ํจ์์ด๋ค. ์ด ํจ์๋ items ๋ฐฐ์ด์ ๋งจ ๋ค์ ์๋ก์ด item์ ์ถ๊ฐํ๋ค.
mutating ํค์๋๋ฅผ ํจ์ ์ ์ธ๋ถ์ ์ถ๊ฐํ๋ค. ์๋ํ๋ฉด swift์ struct๋ ๊ฐ(value) ํ์
์ด๋ฏ๋ก struct์ ๋ณ์ ํ๋กํผํฐ ๊ฐ์ ์ธ์คํด์ค ๋ฉ์๋์์ ๋ณ๊ฒฝํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ฆ, push ํจ์๋ Stack struct์ ์ธ์คํด์ค ๋ฉ์๋์ด๊ณ , ์ด ํจ์์์๋ Stack struct์ ๋ณ์ ํ๋กํผํฐ items์ ๋ด์ฉ์ ์์ ํด์ผ ํ๊ธฐ ๋๋ฌธ์ mutating ํค์๋๋ฅผ ํจ์ ์ ์ธ ์์ ๋ถ์ฌ์ฃผ๋ ๊ฒ์ด๋ค.๐กย
**mutatingํค์๋**
struct์ ์ธ์คํด์ค๋ฅผ ์์(constant)๋ก ์ ์ธํ๋ฉด struct์ ๋ณ์ ํ๋กํผํฐ ๊ฐ์ ์์ ํ ์๊ฐ ์๋ค. ํ๋กํผํฐ๊ฐ ์์๋ ๋ณ์๋ ๋ญ๋ผ๊ณ ์ ์ธ๋์๋ ์ง ๊ฐ์ ๋ชจ๋ ๋ค ์์๋ก ์ทจ๊ธ๋๋ค.
let stk1 = Stack() // ์์๋ก ์ ์ธํ Stack struct์ ์ธ์คํด์ค stk1์ด๋ค. var stk2 = Stack() // ๋ณ์๋ก ์ ์ธํ Stack struct์ ์ธ์คํด์ค stk2์ด๋ค.๊ทธ๋ฌ๋ ๋ฌธ์ ๋ Swift์์ struct๋ฅผ ๋ง๋ค๋ฉด Swift๋ ์ฐ๋ฆฌ๊ฐ ์ด struct๋ฅผ ๋ณ์๋ก ์ธ์ง ์์๋ก ์ธ์ง ๋ชจ๋ฅธ๋ค๋ ๊ฒ์ด๋ค(!). ์์๋ก ์ ์ธ๋๋ฉด ์์ ๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅํ์ง๋ง, ๋ณ์๋ก ์ ์ธ๋๋ฉด ํ๋กํผํฐ์ ๊ฐ์ด ๋ณ๊ฒฝ ๊ฐ๋ฅํ๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์์ ํ ์ ๊ทผ์ ์ํด ํ๋กํผํฐ๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๊ตฌ์ฒด์ ์ผ๋ก ์์ฒญ(request)๋ฅผ ํด์ผ ํ๋ค. โ์ด ํจ์๋ ํ๋กํผํฐ ๊ฐ์ ๋ณ๊ฒฝํด์ฃผ๋ ํจ์์์'๋ผ๊ณ ํ์๋ฅผ ํด์ค๋ค๊ณ ์๊ฐํ๋ฉด ํธํ๋ค.
์ฌ๊ธฐ์ ์์ฒญ์ ํ๋ ๋ฐฉ๋ฒ์ ๋ฉ์๋ ์ ์ธ๋ถ ์์
mutatingํค์๋๋ฅผ ๋ถ์ฌ์ฃผ๋ ๊ฒ์ด๋ค.
์ธ์คํด์ค ๋ณ์ items์ ์๋ก์ด item์ append๋ฅผ ์ฌ์ฉํ์ฌ ์ถ๊ฐํ๋ค. ์๊ฐ ๋ณต์ก๋๋ O(1)์ด ๋๋ค.
โ๏ธย pop
mutating func pop() -> String? {
return self.items.popLast()
}
items์ ๊ฐ์ฅ ๋ง์ง๋ง์ ์๋ ์์๋ฅผ [popLast()](https://developer.apple.com/documentation/swift/array/poplast())๋ฅผ ์ฌ์ฉํ์ฌ ์ ๊ฑฐํ๋ค. popํจ์๋ ํ๋กํผํฐ(items)์ ๊ฐ์ ๋ณ๊ฒฝํ๋ฏ๋ก mutating ํค์๋๋ฅผ ์์ฑํ๋ค. ์๊ฐ ๋ณต์ก๋๋ O(1)์ด๋ค.
โ๏ธย top
func top() -> String? {
return self.items.last
}
top์ ๋ฐฐ์ด์ last๋ก ๋ง์ง๋ง ์์๋ฅผ ๊ตฌํ๋ค. ์๊ฐ ๋ณต์ก๋๋ O(1)์ด๋ค.
๐ดย ์ ์ฒด ์ฝ๋
struct Stack {
var items: [String] = []
mutating func push(_ item:String) {
self.items.append(item)
}
mutating func pop() -> String? {
return self.items.popLast()
}
func top() -> String? {
return self.items.last
}
}
๐ตย ์ฌ์ฉ๋ฒ
var stk = Stack()
stk.push("hi") // Stack(items: ["hi"])
stk.push("my") // Stack(items: ["hi", "my"])
stk.push("name") // Stack(items: ["hi", "my", "name"])
stk.push("is") // Stack(items: ["hi", "my", "name", "is"])
stk.push("swift.") // Stack(items: ["hi", "my", "name", "is", "swift."])
stk.pop() // Optional("swift.")
stk.push("python.") // Stack(items: ["hi", "my", "name", "is", "python."])
stk.top() // Optional("python.")
์์ฃผ ์ ์๋ํ๋ค. ๋จ์ง pop๊ณผ top์ ๊ฒฐ๊ณผ๊ฐ ์ต์ ๋์ธ ์ด์ ๋ ๋ฆฌํด๊ฐ์ ์ต์ ๋๋ก ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ด๋ค(์~).
๋ฐฐ์ด์ ์ด์ฉํ ์คํ ๊ตฌํ์ ๋ค๋ฅด๊ฒ ๋ง๋ค ์๋ ์๋ค. ๋์ ์๊ฐ ๋ณต์ก๋์์ ์ฐจ์ด๊ฐ ๋๋คโ๏ธ
์ด๋ฒ์ ๋ฐฐ์ด์ ๊ฐ์ฅ ์ฒซ๋ฒ์งธ์ ์๋ก์ด ์์๋ฅผ ์ถ๊ฐ(push)ํ๊ณ , ์ญ์ (pop)ํด๋ณด๋๋ก ํ์.
โ๏ธย ๊ตฌ์กฐ์ฒด ์ ์ธ
struct Stack {
var items: [String] = []
}
๋ฌธ์์ด์ ์๋ฃํ์ผ๋ก ํ๋ ๋ฐฐ์ด๊ณผ Stack ๊ตฌ์กฐ์ฒด๋ฅผ ์์ฑํ๋ค.
โ๏ธย push
mutating func push(_ item: String) {
self.items.insert(item, at: 0)
}
๋ฐฐ์ด์ insert(contentsof:at:)๋ฅผ ์ฌ์ฉํ์ฌ 0๋ฒ์งธ ์ธ๋ฑ์ค์ ๊ฐ์ ์ถ๊ฐํ๋ค. ์๊ฐ ๋ณต์ก๋๋ O(n+m)์ด๋ค.
โ๏ธย pop
mutating func pop() -> String? {
return self.items.removeFirst()
}
๋ฐฐ์ด์ removefirst(_:)์ ์ฌ์ฉํ์ฌ ๊ฐ์ฅ ์ต๊ทผ์ ์ถ๊ฐ๋ ๊ฐ(์ธ๋ฑ์ค 0์ธ ๊ฐ)์ ์ ๊ฑฐํ๋ค. ์๊ฐ ๋ณต์ก๋๋ O(n)์ด๋ค.
โ๏ธย top
func top() -> String? {
return self.items.first
}
๋ฐฐ์ด์ first๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฅ ์ต๊ทผ์ ๊ฐ์ ๊ฐ์ ธ์จ๋ค. ์๊ฐ ๋ณต์ก๋๋ O(1)์ด๋ค.
๐ดย ์ ์ฒด์ฝ๋
struct Stack {
var items: [String] = []
mutating func push(_ item: String) {
self.items.insert(item, at: 0)
}
mutating func pop() -> String? {
return self.items.removeFirst()
}
func top() -> String? {
return self.items.first
}
}
๐ตย ์ฌ์ฉ๋ฒ
var stk = Stack()
stk.push("hi") // Stack(items: ["hi"])
stk.push("my") // Stack(items: ["my", "hi"])
stk.push("name") // Stack(items: ["name", "my", "hi"])
stk.push("is") // Stack(items: ["is", "name", "my", "hi"])
stk.push("swift.") // Stack(items: ["swift.", "is", "name", "my", "hi"])
stk.pop() // Optional("swift.")
stk.push("python.") // Stack(items: ["python.", "is", "name", "my", "hi"])
stk.top() // Optional("python.")
์๋ก์ด item์ items ๋ฐฐ์ด์ ๊ฐ์ฅ ์ฒซ๋ฒ์งธ ์ธ๋ฑ์ค์ ๋ค์ด์จ๋ค. ๊ทธ๋ฌ๋ฏ๋ก pop์ ํ๋ฉด ๊ฐ์ฅ ๋์ค์ ์ถ๊ฐ๋ item์ด ์ ๊ฑฐ๋๋ค.
์ง๊ธ๊น์ง ๋ฐฐ์ด์ ์ฌ์ฉํด์ ์คํ์ ๊ตฌํํ๋ค. ๊ทผ๋ฐ ์ฌ๊ธฐ์ ์คํ ๊ตฌ์กฐ์ฒด๋ฅผ ๋ โ์๋ฆ๋ต๊ฒ' ๋ฐ์ ํด๋ณผ ์ ์๋ค.
๊ทธ๋ฅ ์คํ ๊ตฌ์กฐ์ฒด๋ง ์ถ๋ ฅํ๋ฉด ์ด๋ค ๊ฐ์ด ์์ด๊ณ ๋ค์ธ์ง ์๊ธฐ ์ด๋ ต๋ค. swift์์ ์ ๊ณตํ๋ CustomStringConvertible ํ๋กํ ์ฝ์ ์ฌ์ฉํ๋ฉด ๋ด๊ฐ ์ํ๋ ํํ๋ก ์ถ๋ ฅ์ ์ปค์คํ
ํ ์ ์๋ค! ์์์
extension Stack: CustomStringConvertible {
var description: String {
let header = "----Stack----\n"
let body = items.reversed().joined(separator: "\n")
let footer = "\n-------------\n"
return header+body+footer
}
}
์ด๋ ์๋์ ๊ฐ์ด ์ฌ์ฉ๋๋ค!!
var stk = Stack()
stk.push("hi")
stk.push("my")
stk.push("name")
stk.push("is")
stk.push("swift.")
print(stk)
/*
----Stack----
swift.
is
name
my
hi
-------------
*/
Stack์ ๋ชจ์์ ์๊ธฐ ์ฝ๊ฒ ์ถ๋ ฅ์ด ๋๋ค. CustomStringConvertible ํ๋กํ ์ฝ์ ์ ํ์ฌํญ์ด๋ฏ๋ก ํ์์ ๋ฐ๋ผ ๊ตฌํํ๋ฉด ๋๋ค.
์ง๊ธ๊น์ง ๋ง๋ ์คํ์ String ์๋ฃํ์ผ๋ก๋ง ์ ์ธํ๋ค. ๊ทธ๋ผ ๋ค๋ฅธ ์๋ฃํ์ ์คํ์ ์ฌ์ฉํ๋ ค๋ฉด ๋ ๋๊ฐ์ ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ๋? ๋๋ฌด ๋นํจ์จ์ ์ธ๋ฐโฆ
Swift๋ ์ด๋ฅผ ์ํด Generic Type์ ์ ๊ณตํ๋ค. Genericํ ์ฝ๋๋ ๋ชจ๋ ์๋ฃํ์ ์์ฉํ ์ ์์ด ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค~~
์๋กญ๊ฒ ๋ง๋ค์ด๋ณผ ์ฝ๋๋ (2)์ ๊ตฌ์กฐ์ฒด์ด๋ค.
// 1
struct Stack<T> {
// 2
var items: [T] = []
// 3
mutating func push(_ T) {
self.items.append(item)
}
mutating func pop() -> T? {
return self.items.popLast()
}
func top() -> T? {
return self.items.last
}
}
์ด์ String ๋ฟ๋ง ์๋๋ผ ๋ชจ๋ ์๋ฃํ์ด ์ด ์คํ ๊ตฌ์กฐ์ฒด๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
์ฌ๊ธฐ๊น์ง ์ฝ๋ค๋ณด๋ฉด ๊ธฐ๋ณธ ๋ด์ฅ Stack์ ์๋โฆ ์๊ฐํ ๊ฒ์ด๋ค. C++์ STL์ด๋ Python์ Collections ์ฒ๋ผ!
๊ทธ๋์ ์์๋ณด๋ Swift๋ ๊ธฐ๋ณธ ์คํ ํจ์๊ฐ ์กด์ฌํ๋๋ผ!! ๋ฌผ๋ก ์คํ ํ๋๋ก ์ฐ๋ ๊ฒ์ ์๋๊ณ deque๋ก ์ด๋ค. ์ด๊ฑธ๋ก stack, queue, deque๊น์ง ๋ชจ๋ ์ฌ์ฉํ ์ ์๋ค. ์ด๋ฆ๋ python์ collections.deque์ ๊ฐ๋ค.
๊ต์ฅํ ์ต๊ทผ์ ๋์จ ๊ฒ์ผ๋ก ํ์ธ์ด ๋๋ค. (Swift Collections 1.0.2 released on 16 Nov 2021, apple swift-collections github)
Swift Collections
is an open-source package of data structure implementations for the Swift programming language.
Deque, a double-ended queue backed by a ring buffer. Deques are range-replaceable, mutable, random-access collections.
Deque์ ๋ฉ์๋์๋ append, prepend, popFirst, popLast๊ฐ ์์ผ๋ฉฐ ํน์ ์ธ๋ฑ์ค์ ์ฝ์ ๊ณผ ์ญ์ ๋ฅผ ์ํ insert(item, at:), remove(at:)์ด ์๋ค.
๊ทธ๋ผ swift collections์ deque๋ฅผ stack์ผ๋ก ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์.
๋จ,
DequeModule์ ์ํฌํธ ํด์ค์ผ ์ฌ์ฉํ ์ ์๋ค.
xcode ํ๋ก์ ํธ์์ ์ฌ์ฉํ๋ ค๊ณ ํ๋ Collections ํจํค์ง๋ฅผ ๋ค์ด๋ฐ์์ค์ผ ํ๋ค. ๊ผญ ํ์ธํ ๊ฒโ๏ธ
์ฝ๋๋ ์ ํ ๊ณต์ ๊นํ๋ธ๋ฅผ ์ฐธ๊ณ ํ์ต๋๋ค.
var colors: Deque = ["red", "yellow", "blue"]
colors.append("green") // ๋ฐฐ์ด์ ๋ค์ ์ถ๊ฐ
colors.prepend("black") // ๋ฐฐ์ด์ ์์ ์ถ๊ฐ
์คํ์ Push๋ append๋ฅผ ์ฌ์ฉํ๋ฉด ๋๊ฒ ๋ค.
var colors: Deque = ["black", "red", "yellow", "blue", "green"]
colors.popLast() // ๋ฐฐ์ด์ ๋ท ์์ ์ ๊ฑฐ
colors.popFirst() // ๋ฐฐ์ด์ ์ ์์ ์ ๊ฑฐ
์คํ์ pop์ popLast๋ฅผ ์ฌ์ฉํ๋ฉด ๋๊ฒ ๋ค.
Deque๋ Array์ ๋น์ทํ๊ฒ ๋์ํ๋ค๊ณ ํ๋, top์ ๊ธฐ๋ฅ์ ๊ธฐ์กด๊ณผ ๋์ผํ๊ฒ last๋ฅผ ์ฐ๋ฉด ๋๋ค.
์ง๊ธ๊น์ง Swift์์ Stack์ ๊ตฌํ์ ๋ํด ๊ณต๋ถํด๋ณด์๋ค. C++๊ณผ Python์ผ๋ก๋ง ํ๋ฅ ์ฒ์ Swift๋ก ํด๋ดค๋๋ฐ python์ด๋ ๋น์ท~~ํ๋ฉด์๋ ์๋ฃํ ์ ์ธ ๋๋ฌธ์ ์กฐ๊ธ ๊นํ์ค๋ฝ๊ธดํ๋ค. ๊ทธ๋๋ ์คํ์ ์ญ์ ๊ฐ๋จํ๊ณ .. ์ฌ๋ฐ๋ค.
ํ์์ ๋ฐ๋ผ Swift์์ ์คํ์ ๊ตฌํํ๋ฉด ๋๊ณ , ๊ตฌ์กฐ์ฒด๋ก ๋ง๋๋๊ฒ ์ด๋ ต์ง ์์์ ์ง์ ๊ตฌํํด์ผ ํ๋ค๋ฉด ๋ฐฐ์ด๋ก ๊ฐ๋จํ๊ฒ ๋ง๋ค์ด๋ณด์! ๋ง์ฝ ์ฝํ ์์ Collections์ Deque๋ฅผ ์ฌ์ฉํ ์ ์๋ค๋ฉด ์ด๊ฒ์ ์ฌ์ฉํ๋๋ก ํ์. ์ด๋ฏธ ๋ง๋ค์ด์ง ๊ฒ์ ์ฐ๋๊ฒ ๋๋ฒ๊น ํ ๋ ํธํ๋ค!
reference
https://medium.com/devslopes-blog/swift-data-structures-stack-4f301e4fa0dc
https://nitinagam17.medium.com/data-structure-in-swift-stack-part-3-81fdb946b160
https://www.raywenderlich.com/800-swift-algorithm-club-swift-stack-data-structure
https://stackoverflow.com/questions/57059558/is-there-a-built-in-stack-implementation-in-swift
https://docs.swift.org/swift-book/LanguageGuide/Generics.html
https://github.com/apple/swift-collections
https://www.hackingwithswift.com/sixty/7/5/mutating-methods
https://hyerios.tistory.com/190
swift array ์ ์ธ์ ํฌ๊ธฐ ์ด๊ธฐํ : https://stackoverflow.com/questions/24395105/how-to-create-a-fixed-size-array-of-objects