์๋ ํ์ธ์ Foma๐ ์ ๋๋ค.
์ค๋์ ์ฐ๊ฒฐ๋ฆฌ์คํธ์ ๋ํด์ ์์๋ณด๋ ค๊ณ ํ๋๋ฐ์.
์ผ๋ง ์ ์ 2021 ์นด์นด์ค ์ธํด์ฝ์ ์ถ์ ๋์๋ "ํํธ์ง" ์ด๋ผ๋ ๋ฌธ์ ๋ฅผ ํ๊ฒ ๋์๋๋ฐ
ํด๋น ๋ฌธ์ ๋ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ๊ผญ ์ฌ์ฉํด์ผ ํจ์จ์ฑ์ ํต๊ณผํ ์ ์๋ ๋ฌธ์ ์์ต๋๋ค.
๊ทธ ๋์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํด๋ณผ ์ผ์ด ๊ฑฐ์ ์์ด์ ๊ตฌ์ฒด์ ์ผ๋ก ์์๋ณธ ์ ์ด ์์๋๋ฐ
์ด๋ฒ ๊ธฐํ์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ์ฅ์ ๊ณผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ ๋ฆฌํ๋ ค๊ณ ํฉ๋๋ค.
๋ฐ๋ก ์์ํ ๊ฒ์~
Linked List๋?
"์ฐ๊ฒฐ ๋ฆฌ์คํธ, ๋งํฌ๋ ๋ฆฌ์คํธ(linked list)๋ ๊ฐ ๋ ธ๋๊ฐ ๋ฐ์ดํฐ์ ํฌ์ธํฐ๋ฅผ ๊ฐ์ง๊ณ ํ ์ค๋ก ์ฐ๊ฒฐ๋์ด ์๋ ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ์๋ฃ ๊ตฌ์กฐ์ด๋ค. ์ด๋ฆ์์ ๋งํ๋ฏ์ด ๋ฐ์ดํฐ๋ฅผ ๋ด๊ณ ์๋ ๋ ธ๋๋ค์ด ์ฐ๊ฒฐ๋์ด ์๋๋ฐ, ๋ ธ๋์ ํฌ์ธํฐ๊ฐ ๋ค์์ด๋ ์ด์ ์ ๋ ธ๋์์ ์ฐ๊ฒฐ์ ๋ด๋นํ๊ฒ ๋๋ค. ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ์ข ๋ฅ๋ก๋ ๋จ์ผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ, ์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ ๋ฑ์ด ์๋ค.
์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ ๋์ด์ ๋ ธ๋์ ์ค๊ฐ์ง์ ์์๋ ์๋ฃ์ ์ถ๊ฐ์ ์ญ์ ๊ฐ O(1)์ ์๊ฐ์ ๊ฐ๋ฅํ๋ค๋ ์ฅ์ ์ ๊ฐ๋๋ค. ๊ทธ๋ฌ๋ ๋ฐฐ์ด์ด๋ ํธ๋ฆฌ ๊ตฌ์กฐ์๋ ๋ฌ๋ฆฌ ํน์ ์์น์ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํด ๋ด๋๋ฐ์๋ O(n)์ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ๋จ์ ๋ ๊ฐ๊ณ ์๋ค." - ์ํค ๋ฐฑ๊ณผ -
์ฆ, ํฌ์ธํฐ๋ฅผ ํตํด์ ๋ ธ๋๊ฐ ์ฐ๊ฒฐ๋์ด ์๋ ๋ฐ์ดํฐ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ผ๊ณ ํฉ๋๋ค.
์ฅ์
์ญ์ ๋ ์ถ๊ฐ๊ฐ O(1) ์๊ฐ์ ๊ฐ๋ฅํ๋ค.
๋ณดํต ๋ฐฐ์ด์ ์๋์ ๊ฐ์ด index๋ก ํฌ๊ธฐ๊ฐ ์ ํด์ ธ ์์ต๋๋ค.
์ฌ๊ธฐ์ ํ๋์ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๋ ค๊ณ ํ๋ฉด ๊ทธ ๋ค์ ๋ชจ๋ ๋ฐ์ดํฐ๋ค์ด ์ฌ๋ฐฐ์น๋์ด์ผ ํฉ๋๋ค.
์ถ๊ฐ ๋ํ ๋ง์ฐฌ๊ฐ์ง๋ก ์ถ๊ฐ๋๋ ์ธ๋ฑ์ค ๋ค์ ๋ชจ๋ ๋ฐ์ดํฐ๋ค์ด ์ฌ๋ฐฐ์น๊ฐ ๋ฉ๋๋ค.
ํ์ง๋ง ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ ๋ฐ์ดํฐ๊ฐ ์ญ์ ๋๊ฑฐ๋ ์ถ๊ฐ๋๋ฉด ํด๋น ๋ ธ๋์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ง ๋ณ๊ฒฝํด์ฃผ๊ธฐ ๋๋ฌธ์
๋ฐฐ์ด๋ณด๋ค ์ญ์ ๋ ์ถ๊ฐ์์ ํจ์จ์ ์ ๋๋ค.
๋จ์
ํน์ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๋๋ฐ ๋ฌด์กฐ๊ฑด O(n)์ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค.
๋ฐฐ์ด์ ๊ฒฝ์ฐ ํน์ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ ๋ ์ธ๋ฑ์ค๊ฐ ์์ด ๊ฒ์ํ ๋ ํจ์จ์ ์ ๋๋ค.
ํ์ง๋ง ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ ์ ํด์ง ์์น๋ฅผ ์์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ๊ฒ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ํํด ํน์ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์์ผ ํฉ๋๋ค.
Linked List ๊ตฌ์กฐ
๋จ์ผ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ ์์๋ก ๋ค๊ฒ ์ต๋๋ค.
์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ ์๋์ ๊ฐ์ด ๋ ธ๋์ ํฌ์ธํฐ๋ก ์ด๋ฃจ์ด์ ธ ์๊ณ ๋ค์ ๋ ธ๋์ ์ฐ๊ฒฐ๋์ด ์์ต๋๋ค.
๊ฐ์ฅ ์ฒซ ๋ฒ์งธ ๋ ธ๋๋ฅผ ํค๋๋ผ๊ณ ๋ถ๋ฅด๊ณ ๊ฐ์ฅ ๋ง์ง๋ง ๋ ธ๋๋ฅผ ํ ์ผ์ด๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
Linked List ์ข ๋ฅ
1. ๋จ์ผ ์ฐ๊ฒฐ๋ฆฌ์คํธ
๊ฐ ๋ ธ๋ ๋น ํ ๊ฐ์ ํฌ์ธํฐ๊ฐ ์๊ณ ํฌ์ธํฐ๋ ๋ค์ ๋ ธ๋์ ์์น๋ฅผ ๊ฐ๋ฅดํต๋๋ค.
ํ ์ผ์ ๊ฐ์ฅ ๋ง์ง๋ง์ด๋ฏ๋ก ๋ค์์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ฅผ ๊ฐ์ง ์์ต๋๋ค.
2. ์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ
๋จ์ผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ ํฌ์ธํฐ๋ฅผ ํ ๊ฐ ๊ฐ์ง๊ณ ์์ด ๋ค์ ๋ ธ๋๋ง ๊ฐ๋ฆฌํฌ ์ ์์๋ค๋ฉด
์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ ํฌ์ธํฐ๋ฅผ ๋ ๊ฐ ๊ฐ์ง๊ณ ์์ด ์ด์ ๋ ธ๋์ ๋ค์ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํต๋๋ค.
3. ์ํ ์ฐ๊ฒฐ ๋ฆฌ์คํธ
๋จ์ผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ํ ์ผ์ ํฌ์ธํฐ๊ฐ ์ถ๊ฐ๋ ํํ๋ก ํ ์ผ์ ํฌ์ธํฐ๋ ํค๋๋ฅผ ๊ฐ๋ฅด์ผ ์ํ์ด ๋๋๋ก ํฉ๋๋ค.
Code
์ง๊ธ๋ถํฐ๋ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ ๊ตฌํํด๋ณด๊ฒ ์ต๋๋ค.
(์ฐ๊ฒฐ๋ฆฌ์คํธ ์ค์์ ๋จ์ผ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ ๊ตฌํํ๊ฒ ์ต๋๋ค.)
Node
๋ ธ๋๋ ํ์ฌ ๊ฐ๊ณผ ๋ค์ ๋ ธ๋๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
class Node<T> {
let value:T
var next:Node?
init(value:T,next:Node? = nil) {
self.value = value
self.next = next
}
}
Linked List
ํค๋๊ฐ ๋ฌด์กฐ๊ฑด ์กด์ฌํ๋ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ก ์ ์ธํ์ต๋๋ค.
class LinkedList<T> {
var head:Node<T>!
init(head:Node<T>) {
self.head = head
}
}
append
head๋ถํฐ ๋ค์ ๋ ธ๋๊ฐ ์๋ ๋ ธ๋๋ฅผ ์ฐพ์๋ ๋๋ค. (๋ง์ง๋ง ๋ ธ๋)
๊ทธ๋ฆฌ๊ณค ํด๋น ๋ ธ๋์ ๋ค์ ๋ ธ๋๋ฅผ ํ์ฌ ๊ฐ์ผ๋ก ์ค์ ํด์ค๋๋ค.
func append(value:T) {
var node:Node = head
while node.next != nil {
node = node.next!
}
node.next = Node(value: value)
}
insert(at:)
๋ง์ฝ 0๋ฒ์งธ ์ฝ์ ํ๋ค๋ฉด head๊ฐ ๋๋ฏ๋ก ํ์ฌ ๊ฐ์ ๊ฐ์ง๋ Node๋ฅผ head๋ก ๋ง๋ค์ด์ฃผ๊ณ
head์ ๋ค์ ๊ฐ์ ์ด์ ์ head๋ก ๋ฃ์ด์ค๋๋ค.
๊ทธ๊ฒ ์๋๋ผ๋ฉด index์ ๋ฐ๋ก ์ ๋ฒ์งธ๋ฅผ ์ฐพ์์ ๋ค์ ๊ฐ์ ๋ณ๊ฒฝํด์ค๋๋ค.
func insert(value:T,at index:Int) {
var node = head
if index == 0 {
let pastHead = head
head = Node(value: value)
head.next = Node(value: pastHead!.value,next:pastHead?.next)
return
}
for _ in 0..<index-1 {
node = node?.next
}
if node?.next == nil {
fatalError("list์ ํฌ๊ธฐ๋ณด๋ค index๊ฐ ์ปค์ insert๊ฐ ์๋ฉ๋๋ค.")
}
let next = node?.next
node?.next = Node(value:value,next:next)
}
remove(at:)
0๋ฒ์งธ๋ head๋ฅผ ์ง์ฐ๋ ๊ฒ์ด๋ฏ๋ก ๊ทธ ๋ค์ ๊ฐ์ head๋ก ๋ง๋ค์ด์ค๋๋ค.
0๋ฒ์งธ๊ฐ ์๋๋ผ๋ฉด ํด๋น index์ ๋ฐ๋ก ์ Node๋ฅผ ์ฐพ์์ ๋ค์ Node ๊ฐ์ ๋ณ๊ฒฝํด์ค๋๋ค.
func remove(at index:Int) {
var node = head
if index == 0 {
if head.next == nil {
fatalError("head๋ง๊ณ ๋ค๋ฅธ ๊ฐ์ด ์์ด์ remove๊ฐ ์๋ฉ๋๋ค.")
}
head = Node(value: head.next!.value, next: head.next?.next)
return
}
for _ in 0..<index-1 {
node = node?.next
}
if node?.next == nil {
fatalError("list์ ํฌ๊ธฐ๋ณด๋ค index๊ฐ ์ปค์ remove๊ฐ ์๋ฉ๋๋ค.")
}
if let next = node?.next?.next {
node?.next = Node(value:next.value,next:next.next)
}else {
node?.next = nil
}
}
์ด๋ ๊ฒ ์ค๋์ ์ฐ๊ฒฐ๋ฆฌ์คํธ๊ฐ ๋ฌด์์ด๊ณ ๊ฐ๋จํ๊ฒ ๊ตฌํํด๋ณด์๋๋ฐ์.
ํน์๋ผ๋ ํ๋ฆฐ ์ ์ด ์๊ฑฐ๋ ์ง์ ํด์ฃผ์ค ๋ถ๋ถ์ด ์๋ค๋ฉด ์ธ์ ๋ ๋๊ธ๋ก ์๋ ค์ฃผ์ธ์!
๋๊ธ