0. ๋ค์ด๊ฐ๊ธฐ
ํ๋ก๊ทธ๋จ์ ์๋ ๋ฉ๋ชจ๋ฆฌ, ๋คํธ์ํฌ ํ๋กํ ์ฝ, ์ฌ๋ฌ ํ
์คํธ ํ๋ก๊ทธ๋จ ๋ฑ ์ฌ๋ฌ ๊ณณ์์ ๊ณตํต์ ์ผ๋ก ์ฐ์ด๋ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์๊ณ ๊ณ์ ๊ฐ์?
๋ฐ๋ก ์คํ์
๋๋ค! ์ค๋์ ์คํ์ ์ง์ ๊ตฌํํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
1. ๊ตฌ์กฐ
์ฌ๊ทํจ์๊ฐ ์ด๋ป๊ฒ ๋์ํ๋์ง ๊ถ๊ธํ์ ์ ์์ผ์ ๊ฐ์? ์ด๋ฏธ ์๊ณ ๊ณ์๋ค๊ตฌ์?
์ฌ๊ทํจ์๋ ํ์ฌ ์คํ ์ค์ธ ์๋ธ๋ฃจํด์ ๊ดํ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ์ฝ์คํ์ ์ฌ์ฉํ์ฌ ๋ฃจํด์ ์ฒ๋ฆฌํ๊ณ , ์์ ๋ฃจํด์ผ๋ก ๋์๊ฐ๋๋ค.
์ด๋ ์ฌ์ฉํ๋ ์ฝ ์คํ์ด ์คํ๊ณผ ๊ฐ์ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๊ณ ์์ฃ !
์คํ(stack)์ ๋ญ๊ฐ๋ฅผ ์์๋์ '๋๋ฏธ'๋ฅผ ๋ปํฉ๋๋ค. ๊ฑด์ด๋๋ฏธ, ์๋ฅ๋๋ฏธ, ์ท๋๋ฏธ ๋ฑ์ ์๋ก ๋ค์ ์๊ฒ ์ต๋๋ค.
์๊ฐ์ ์ผ๋ก๋ ์ ์ผ ๋จผ์ ๋ค์ด์จ ๋ฐ์ดํฐ๊ฐ ์ ์ผ ๋ฐ์์ ์์นํ๊ณ , ์ ์ผ ๋์ค์ ๋ค์ด์จ ๋ฐ์ดํฐ๊ฐ ์ ์ผ ์์ ์์นํฉ๋๋ค.
๋ฐ์ดํฐ๊ฐ ์ค๊ฐ๋ ํต๋ก๋ ์ ์ผ ์์ ํ๋๋ง ์กด์ฌํ๊ณ , ์ด๋ฅผ push/pop์ผ๋ก ๊ด๋ฆฌํฉ๋๋ค.
ํ๋์ ๊ตฌ๋ฉ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ด๋ฃ๊ณ , ๊ตฌ๋ฉ์์ ๋ฐ์ดํฐ๊ฐ ํ์ด๋์ค๋ ๋ชจ์ต์ด ๊ทธ์ผ๋ง๋ก push์ pop ์
๋๋ค.
2. ๊ตฌํ
์คํ ๋ญ ์ด๋ ค์ธ ๊ฒ ์๊ฒ ์ต๋๊น ๋ฐ๋ก ๊ฐ๋ณด๊ฒ ์ต๋๋ค.
struct Stack<T>{
private var stack: [T] = []
var count: Int{
return self.stack.count
}
var isEmpty: Bool{
return stack.isEmpty
}
var top: T?{
return stack.last
}
}
์ ๋ค๋ฆญ์ ์ฑํํ ๊ตฌ์กฐ์ฒด๋ฅผ ์ ์ํ๊ณ , swift์ ๊ธฐ๋ณธ ์๋ฃํ์ธ Array๋ฅผ private๋ก ์์ฑํ์์ต๋๋ค.
ํ์ฌ ๋ฐ์ดํฐ์ ๊ฐฏ์๋ฅผ ๋ฐํํ๋ count, ๋น์ด์๋์ง๋ฅผ ํ์ธํ๋ isEmpty, ์ต์์ ์์๋ฅผ ๋ฐํํ๋ top๋ฅผ ํ๋กํผํฐ๋ก ๊ฐ์ง๋๋ค.
///์ ๋
ธ๋๋ฅผ ์คํ ์์ ์ฌ๋ฆผ
mutating func push(_ data: T){
self.stack.append(data)
}
///์คํ ์ต์๋จ ๋
ธ๋์ ๋ฐ์ดํฐ๋ฅผ ๋ฐํ ํ ๋
ธ๋ ์ญ์
mutating func pop()->T?{
return self.stack.popLast()
}
๊ตฌ์กฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ mutating func๋ก ๋ฐฐ์ด์ ์กฐ์ํ๊ณ ์์ต๋๋ค. (Swift์ ํค์๋๋... ๋์ค์ ์ ๋๋ก ์ ๋ฆฌํ ๊ฒ์...!)
Array๋ O(1)์ธ append์ popLast๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ ์ฐ์ฐ์ด ์์์๊ฐ ์์ ๋์ํฉ๋๋ค.
popLast์ removeLast์ ์ฐจ์ด๋ฅผ ์๊ณ ๊ณ์ ๊ฐ์?
๋ ๋ฉ์๋๋ ๊ณตํต์ ์ผ๋ก Array์ ๋ง์ง๋ง ์์๋ฅผ ์ ๊ฑฐํ๊ณ , ์ ๊ฑฐํ ์์๋ฅผ ๋ฐํํฉ๋๋ค.
๊ทธ๋ฌ๋ removeLast๋ ์ฌ์ฉ์ ์ ์ ์กฐ๊ฑด์ด ์์ต๋๋ค. ๋ฐ๋์ ๋น์ด์์ง ์์์ผ ํ๋ค๋ ๊ฒ์ด์ฃ !
์ด๋ฌํ ํน์ง์ผ๋ก ๋น์ฐํ๊ฒ๋ ๋ ๋ฉ์๋๋ ๋ฐํ ํ์ ์ด ๋ค๋ฆ ๋๋ค.
(์ฌ๋ด์ผ๋ก ์ฝํ ํ๋ ์ฌ๋๋ค์ removeLast๊ฐ ์ข ๋ ๋น ๋ฆ ๋ค๊ณ ํฉ๋๋ค)
์ ์ฒด ์์ค์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
struct Stack<T>{
var count: Int{
return self.stack.count
}
var isEmpty: Bool{
return stack.isEmpty
}
var top: T?{
return stack.last
}
private var stack: [T] = []
///์ ๋
ธ๋๋ฅผ ์คํ ์์ ์ฌ๋ฆผ
mutating func push(_ data: T){
self.stack.append(data)
}
///์คํ ์ต์๋จ ๋
ธ๋์ ๋ฐ์ดํฐ๋ฅผ ๋ฐํ ํ ๋
ธ๋ ์ญ์
mutating func pop()->T?{
return self.stack.popLast()
}
}
๋ง๋ฌด๋ฆฌ
๊ฐ๋จํ๊ฒ ์คํ์ ๊ตฌํํด๋ณด์์ต๋๋ค. ์ด๋ฏธ Array์ ํ์ํ ๋ฉ์๋๊ฐ ๋ค ๊ตฌํ๋์ด์์ด ๋ํํ๊ฒ์ ๋ถ๊ณผํฉ๋๋ค๋ง...
Swift๋ฅผ ์ฌ์ฉํ๋ ์
์ฅ์์ ์คํ์ ์ ๋ง ์๊ธดํ ์ ์ด, ์๋ฃ์ ์ฝ์
๊ณผ ์ญ์ ๊ฐ ์์์๊ฐ์ ์ด๋ฃจ์ด์ง๋ค๋ ์ ์์ ๋ค์ํ๊ฒ ํ์ฉํ ์ ์์ต๋๋ค.
ํ๋ฅผ ๋ด์ฅํ๊ณ ์์ง ์์ Swift์์, ์คํ ๋๊ฐ๋ฅผ ์ฌ์ฉํ๋ฉด ๋์์ง ์์ ์ฑ๋ฅ์ ํ๋ฅผ ๋น ๋ฅด๊ฒ ๊ตฌํํ ์ ์์ต๋๋ค.
๋ํ ํด๋น ํ๋ฅผ ๋ค์ 2๊ฐ๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฐฉํฅ ์
์ถ๋ ฅ์ ์ง์ํ๋ ํ์ธ ๋ฑ๋ ๊ฐ๋จํ๊ฒ ๊ตฌํํ ์ ์์ฃ !
ํ์ ๋ฑ์ผ๋ก ๋ค์ ํฌ์คํ ์์ ๋ง๋์!