[Swift][λ²μ] μ€μννΈμ μλ£κ΅¬μ‘°μ μκ³ λ¦¬μ¦ - μΉμ 2. κΈ°μ΄ μλ£κ΅¬μ‘° - μ±ν°6-2. μ°κ²°λ¦¬μ€νΈ (μ€μννΈ μ½λ μ νλ‘ν μ½, λ°Έλ₯ μ맨ν±, COW(μΉ΄νΌ-μ¨-λΌμ΄νΈ))
Raywenderlich.com μμ λμ¨ Data Structures & Algorithms in Swift μ± μ λ°λͺ¨ 곡κ°λ³Έμ λ²μνμμ΅λλ€. μ¦κ²κ² λ΄μ£ΌμΈμ.
https://www.raywenderlich.com/books/data-structures-algorithms-in-swift
μΉμ 2. κΈ°μ΄ μλ£κ΅¬μ‘° Elementary Data Structure
μ±ν° 6. μ°κ²° 리μ€νΈ Linked Lists
μ€μννΈ μ½λ μ νλ‘ν μ½ Swift collection protocols
μ€μννΈ νμ€ λΌμ΄λΈλ¬λ¦¬μ μλ νλ‘ν μ½λ€μ νΉμ νμ μ λν΄ μμλλ κ²μ μ μνλλ‘ λμμ€λλ€. μ΄ νλ‘ν μ½λ€μ νΉμ± λ° μ±λ₯μ λν΄ λ³΄μ₯μ μ 곡ν©λλ€. μ΄ νλ‘ν μ½ μΈνΈμμ μ½λ μ κ³Ό κ΄κ³λ 4κ°μ§ νλ‘ν μ½μ μ΄μ μ λ§μΆ κ²μ λλ€.
κ° νλ‘ν μ½μ΄ νλ μΌμ λν΄ κ°λ΅ν μμ½νμλ©΄
- 1 κ³μΈ΅(Tier 1), μνμ€ (Sequence) : μνμ€ νμ μ μμμ μμ°¨μ μ κ·Όμ μ 곡ν©λλ€. μ£Όμν΄μΌ λ μ€μν λΆλΆμ΄ μμ΅λλ€. μμ°¨μ μ κ·Όμ μμλ€μ νκ΄΄μ μΌλ‘ μλͺ¨νλ―λ‘ λ€μ λ°©λ¬Έν μ μμ΅λλ€.
- 2 κ³μΈ΅(Tier 2), μ½λ μ (Collection) : μ½λ μ νμ μ μΆκ°μ μΈ λ³΄μ₯μ΄ μ 곡λλ μνμ€ νμ μ λλ€. μ½λ μ νμμ μ ννλ©°, λ°λ³΅μ μΈ λΉνκ΄΄μ μμ°¨ μ κ·Όμ νμ©ν©λλ€.
- 3 κ³μΈ΅(Tier 3), μλ°©ν₯ μ½λ μ (BidirectionalCollection) : μ½λ μ νμ μ, μ΄λ¦μμ μ μ μλ―μ΄ μνμ€λ₯Ό μμλ μλ°©ν₯μΌλ‘ μ΄λν μ μλ μλ°©ν₯ μ½λ μ νμ μ΄ λ μ μμ΅λλ€. μ°κ²°λ¦¬μ€νΈλ μ€μ§ headμμ tail λ‘λ§ μ΄λν μ μμΌλ―λ‘ μ°κ²°λ¦¬μ€νΈμμλ λΆκ°λ₯ν©λλ€.
- 4 κ³μΈ΅(Tier 4), λλ€ μ‘μΈμ€ μ½λ μ (RandomAccessCollection) : μλ°©ν₯ μ½λ μ μ νΉμ μΈλ±μ€μ μμΉν μμμ μ κ·Όνλ κ²μ΄ λ€λ₯Έ μΈλ±μ€μ μμΉν μμμ μ κ·Όνλ κ²λ§νΌ κ±Έλ¦°λ€λ κ²μ΄ 보μ₯λ κ²½μ° λλ€ μ‘μΈμ€ μ½λ μ νμ μ΄ λ μ μμ΅λλ€. 리μ€νΈ μμͺ½μ κ°κΉμ΄ λ Έλμ μ κ·Όνλ κ²μ΄ 리μ€νΈ λ·μͺ½μ μλ μμμ μ κ·Όνλ κ²λ³΄λ€ ν¨μ¬ λΉ λ₯΄κΈ° λλ¬Έμ μ°κ²°λ¦¬μ€νΈμμλ λΆκ°λ₯ν©λλ€.
κ°κ°μ λν΄μλ λ λ§μ λ΄μ©μ΄ μμ΅λλ€. μ¬λ¬λΆμ κ°κ°μ μ ν©μ±μ λν΄ μμ±νλ©΄μ μ΄λ₯Ό λ°°μκ°κ² λ κ²μ λλ€.
μ°κ²°λ¦¬μ€νΈλ μ€μννΈ μ½λ μ νλ‘ν μ½μμ λ κ°μ§ μ격μ μ»μ μ μμ΅λλ€. 첫λ²μ§Έλ‘, μ°κ²°λ¦¬μ€νΈλ λ Έλμ 체μΈμ΄λ―λ‘ Sequence νλ‘ν μ½μ μ±ννλ κ²μ΄ ν©λ¦¬μ μ΄λ©° λμ§Έλ‘ λ Έλμ 체μΈμ μ νν μνμ€μ΄λ―λ‘ Collection νλ‘ν μ½μ μ±ννλ κ²μ΄ ν©λ¦¬μ μ λλ€.
μ€μννΈ μ½λ μ ꡬννκΈ°
μ΄λ² μΉμ μμ μ¬λ¬λΆμ Collection νλ‘ν μ½μ ꡬννλ κ²μ μ΄ν΄λ³΄κ² μ΅λλ€. μ½λ μ νμ μ μ νν μνμ€λ‘ λΉνκ΄΄μ μΈ μμ°¨ μ κ·Όμ μ 곡ν©λλ€. μ€μννΈμ Collection μ μΈλ±μ€λ₯Ό 컬λ μ μ κ°μ 맀νν μ μλ λ©μ§ μ©μ΄, 첨μ(subscript)λ₯Ό ν΅ν΄ μ κ·Όν μ μμ΅λλ€.
μ€μννΈ λ°°μ΄μμ 첨μλ₯Ό μ¬μ©ν μμ μ λλ€.
array[5]
λ°°μ΄μ μΈλ±μ€λ Int κ°μ λλ€. μ μμ μμλ 5κ° κ·Έ κ°μ λλ€. 첨μ μ°μ°μ [ λκ΄νΈ ]λ‘ μ μλμ΄ μμ΅λλ€. μΈλ±μ€λ‘ 첨μλ₯Ό μ΄μ©νλ©΄ μ½λ μ μ κ°μ λ°νν©λλ€.
컀μ€ν μ½λ μ μΈλ±μ€
Collection νλ‘ν μ½ λ©μλμ μ±λ₯μ μΈ‘μ νλ νλͺ©μ Index μ κ°μ 맀ννλ μλμ λλ€. Array μ κ°μ λ€λ₯Έ μ€ν λ¦¬μ§ μ΅μ κ³Ό λ€λ₯΄κ² μ°κ²°λ¦¬μ€νΈλ μ μ μΈλ±μ€λ₯Ό μ¬μ©νμ¬ O(1) 첨μ μ°μ°μ μνν μ μμ΅λλ€. κ·Έλ¬λ―λ‘ μ¬λ¬λΆμ λͺ©νλ ν΄λΉ λ Έλμ λν λ νΌλ°μ€λ₯Ό ν¬ν¨νλ 컀μ€ν μΈλ±μ€λ₯Ό μ μνλ κ²μ λλ€.
LinkedList.swift μ μλ extension μ μΆκ°ν©λλ€.
extension LinkedList: Collection {
public struct Index: Comparable {
public var node: Node<Value>?
static public func ==(lhs: Index, rhs: Index) -> Bool {
switch (lhs.node, rhs.node) {
case let (left?, right?):
return left.next === right.next
case (nil, nil):
return true
default:
return false
}
}
static public func <(lhs: Index, rhs: Index) -> Bool {
guard lhs != rhs else {
return false
}
let nodes = sequence(first: lhs.node) { $0?.next }
return nodes.contains { $0 === rhs.node }
}
}
}
Collection μꡬμ¬νμ λ§μ‘±νλ 컀μ€ν μ μ¬μ©ν κ²μ λλ€. μλ λ΄μ©μ extension μμ λ£μ΄ μμ±νμΈμ.
// 1
public var startIndex: Index {
Index(node: head)
}
// 2
public var endIndex: Index {
Index(node: tail?.next)
}
// 3
public func index(after i: Index) -> Index {
Index(node: i.node?.next)
}
// 4
public subscript(position: Index) -> Value {
position.node!.value
}
- startIndex λ μ°κ²°λ¦¬μ€νΈ head μ μν΄ ν©λ¦¬μ μΌλ‘ μ μλ©λλ€.
- Collection μ endIndex λ₯Ό λ§μ§λ§μΌλ‘ μ κ·Όκ°λ₯ν κ° λ€μ μΈλ±μ€λ‘ μ μν©λλ€. κ·Έλ¬λ―λ‘ ail?.next λ₯Ό μ§μ ν©λλ€.
- index(after:) λ μΈλ±μ€λ₯Ό μ¦κ°μν€λ λ°©λ²μ λνλ λλ€. λ¨μν λ€μλ Έλμ μΈλ±μ€λ₯Ό μ§μ νλ©΄ λ©λλ€.
- subscript 첨μλ μ½λ μ μ κ°μ Index μ 맀νμν€κΈ° μν΄ μ¬μ©λ©λλ€. 컀μ€ν μΈλ±μ€λ₯Ό μμ±νμΌλ―λ‘ λ Έλμ κ°μ μ°Έμ‘°νμ¬ μμμκ°(constant time) μμ μ½κ² λ¬μ±ν μ μμ΅λλ€.
μ΄μ Collection μ μ±ννλ μ μ°¨λ₯Ό λ§μΉ©λλ€. νλ μ΄κ·ΈλΌμ΄λ νμ΄μ§λ‘ λμκ°μ μμ΄μ μ ν΄λ΄ μλ€.
example(of: "using collection") {
var list = LinkedList<Int>()
for i in 0...9 {
list.append(i)
}
print("List: \(list)")
print("First element: \(list[list.startIndex])")
print("Array containing first 3 elements: \(Array(list.prefix(3)))")
print("Array containing last 3 elements: \(Array(list.suffix(3)))")
let sum = list.reduce(0, +)
print("Sum of all values: \(sum)")
}
μλ κ²°κ³Όλ¬Όμ λ³Ό μ μμ΅λλ€.
---Example of using collection---
List: 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9
First element: 0
Array containing first 3 elements: [0, 1, 2]
Array containing last 3 elements: [7, 8, 9]
Sum of all values: 45
λ°Έλ₯ μ맨ν±κ³Ό μΉ΄νΌ-μ¨-λΌμ΄νΈ Value semantics and copy-on-write
μ€μννΈ μ½λ μ μ λ λ€λ₯Έ μ€μν νμ§μ λ°Έλ₯ μ맨ν±μ κ°μ§λ€λ μ μ λλ€. μ΄λ μΉ΄μ°(COW)λΌκ³ νλ μΉ΄νΌ-μ¨-λΌμ΄νΈλ₯Ό μ¬μ©νμ¬ ν¨μ¨μ μΌλ‘ ꡬνλ©λλ€. λ°Έλ₯ μ맨ν±μ κ°λ μ μκΈ° μν΄, λ°°μ΄μ μ¬μ©ν λμμ νμν κ²μ λλ€.
μλ μ½λλ₯Ό νλ μ΄κ·ΈλΌμ΄λ νμ΄μ§ μλμͺ½μ μμ±ν©λλ€.
example(of: "array cow") {
let array1 = [1, 2]
var array2 = array1
print("array1: \(array1)")
print("array2: \(array2)")
print("---After adding 3 to array 2---")
array2.append(3)
print("array1: \(array1)")
print("array2: \(array2)")
}
μλ κ²°κ³Όλ¬Όμ λ³Ό μ μμ΅λλ€.
---Example of array cow---
array1: [1, 2]
array2: [1, 2]
---After adding 3 to array 2---
array1: [1, 2]
array2: [1, 2, 3]
array2 κ° μμ λ λ array1 μ μμλ λ³νμ§ μμ΅λλ€. μ€μ λ‘λ array2 λ append κ° νΈμΆλ λ κΈ°λ³Έ μ μ₯μμ 볡μ¬λ³Έμ λ§λλλ€.
μ΄μ μ°κ²°λ¦¬μ€νΈκ° λ°Έλ₯ μ맨ν±μ κ°μ§κ³ μλμ§ νμΈν©λλ€. μλ λ΄μ©μ νλ μ΄κ·ΈλΌμ΄λ νμ΄μ§ μλμ μμ±ν©λλ€.
example(of: "linked list cow") {
var list1 = LinkedList<Int>()
list1.append(1)
list1.append(2)
var list2 = list1
print("List1: \(list1)")
print("List2: \(list2)")
print("After appending 3 to list2")
list2.append(3)
print("List1: \(list1)")
print("List2: \(list2)")
}
μλ κ²°κ³Όλ¬Όμ νμΈν μ μμ΅λλ€.
---Example of linked list cow---
List1: 1 -> 2
List2: 1 -> 2
After appending 3 to list2
List1: 1 -> 2 -> 3
List2: 1 -> 2 -> 3
λΆννλ μ°κ²°λ¦¬μ€νΈμλ λ°Έλ₯ μ맨ν±μ΄ μμ΅λλ€. μλνλ©΄ κΈ°λ³Έ μ μ₯μλ λ νΌλ°μ€ νμ (Node) μ μ¬μ©νκ³ μκΈ° λλ¬Έμ λλ€. μ΄λ μ¬κ°ν λ¬Έμ μ λλ€. LinkedList λ ꡬ쑰체μ΄κ³ λ°λμ λ°Έλ₯ μ맨ν±μ μ¬μ©ν΄μΌλκΈ° λλ¬Έμ λλ€. μΉ΄μ°(COW)λ₯Ό ꡬννλ©΄ μ΄ λ¬Έμ λ₯Ό ν΄κ²°νκ² λ©λλ€.
μΉ΄μ°(COW)λ₯Ό μ¬μ©νμ¬ λ°Έλ₯ μ맨ν±μ λ¬μ±νλ μ λ΅μ κ½€λ λ¨μν©λλ€. μ°κ²°λ¦¬μ€νΈμ μ½ν μΈ λ₯Ό 볡μ νκΈ° μ μ κΈ°λ³Έμ μ₯μμ 볡μ¬λ³Έμ μννκ³ μλ‘μ΄ λ³΅μ¬λ³Έμ λͺ¨λ λ νΌλ°μ€(head μ tail)λ₯Ό μ λ°μ΄νΈ νκ³ μ ν©λλ€.
LinkedList.swift μ μλ λ©μλλ₯Ό LinkedListμ μΆκ°ν©λλ€.
private mutating func copyNodes() {
guard var oldNode = head else {
return
}
head = Node(value: oldNode.value)
var newNode = head
while let nextOldNode = oldNode.next {
newNode!.next = Node(value: nextOldNode.value)
newNode = newNode!.next
oldNode = nextOldNode
}
tail = newNode
}
μ΄ λ©μλλ μ°κ²°λ¦¬μ€νΈμ κΈ°μ‘΄ λ Έλλ₯Ό λμΌν κ°μ κ°μ§ μλ‘ ν λΉλ κ²μΌλ‘ κ΅μ²΄ν©λλ€.
μ΄μ mutating ν€μλλ‘ νμλ LinkedList μ λ€λ₯Έ λͺ¨λ λ©μλλ₯Ό μ°Ύκ³ λͺ¨λ λ©μλμ μλ¨μμ copyNodes λ₯Ό νΈμΆν©λλ€.
μ΄ 6κ°μ λ©μλκ° μμ΅λλ€.
- push
- append
- insert(after:)
- pop
- removeLast
- remove(after:)
κ°μ‘°(retrofit)μ μλ£ν ν λ§μ§λ§ example ν¨μ νΈμΆμ μλ κ²°κ³Όλ¬Όμ 보μ¬μ£Όμ΄μΌ ν©λλ€.
---Example of linked list cow---
List1: 1 -> 2
List2: 1 -> 2
After appending 3 to list2
List1: 1 -> 2
List2: 1 -> 2 -> 3
λ°λ‘ μ¬λ¬λΆμ΄ μν κ²μ λλ€. μλλ©΄ λͺ¨λ mutating νΈμΆμ O(n) μ€λ²ν€λλ₯Ό λμ νκ±°λμ..
μΉ΄μ°(COW) μ΅μ ν
λͺ¨λ mutating νΈμΆμ O(n) μ€λ²ν€λλ₯Ό λμ νλ κ²μ λΆκ°ν©λλ€. λκ°μ§ μ λ΅μ΄ μ΄ λ¬Έμ λ₯Ό μννλ λ° λμμ΄ λ©λλ€. 첫째λ λ Έλκ° ν λͺ μ μμ μλ§ μμ κ²½μ° λ³΅μ¬λ₯Ό λ°©μ§νλ κ²μ λλ€.
isKnownUniquelyReferenced
μ€μννΈ νμ€ λΌμ΄λΈλ¬λ¦¬μλ isKnownUniquelyReferenced λΌλ μ΄λ¦μ ν¨μκ° μμ΅λλ€. μ΄ ν¨μλ μ€λΈμ νΈκ° μ νν νλμ λ νΌλ°μ€λ₯Ό κ°μ§κ³ μλμ§ μ¬λΆλ₯Ό νμΈνλ λ° μ¬μ©λ©λλ€. λ§ν¬λ리μ€νΈ μΉ΄μ° μμ μμ ν μ€νΈνμΈμ.
λ§μ§λ§ example ν¨μ νΈμΆμμ var list2 = list1 λΌκ³ μμ±ν λΆλΆμ μλ μ½λλ₯Ό μ λ°μ΄νΈνμΈμ.
print("List1 uniquely referenced: \(isKnownUniquelyReferenced(&list1.head))")
var list2 = list1
print("List1 uniquely referenced: \(isKnownUniquelyReferenced(&list1.head))")
μ½μμμ μλ λ μ€μ΄ λ³΄μΌ κ²μ λλ€.
List1 uniquely referenced: true
List1 uniquely referenced: false
isKnownUniquelyReferencedμ μ¬μ©νμ¬ κΈ°λ³Έ λ Έλ κ°μ²΄κ° 곡μ λμ§ νμΈν μ μμ΅λλ€. μ΄ λμμ νμΈνμΌλ―λ‘ λκ°μ print ꡬ문μ μμ νμΈμ. κΈΈμ λΆλͺ ν©λλ€. μλμ 쑰건문μ copyNodes μλ¨μ μΆκ°νμΈμ.
guard !isKnownUniquelyReferenced(&head) else {
return
}
μΉ΄μ°(COW)κ° μ¬μ ν μ ν¨ν κ²μ νμΈνκ³ κΈ°λ»ν μ μμ΅λλ€.
---Example of linked list cow---
List1: 1 -> 2
List2: 1 -> 2
After appending 3 to list2
List1: 1 -> 2
List2: 1 -> 2 -> 3
μ΄λ κ² λ°κΏμ, μ°κ²°λ¦¬μ€νΈμ μ±λ₯μ μΉ΄μ°(COW)μ μ΄μ μ κ°μ§ μ± μ΄μ μ μ±λ₯μ ν볡νκ² λ©λλ€.
μ½κ°μ κ³€λ A minor predicament
μλ μ½λλ₯Ό μ΄μ μ μμ μ½λ μμ μΆκ°νμΈμ.
print("Removing middle node on list2")
if let node = list2.node(at: 0) {
list2.remove(after: node)
}
print("List2: \(list2)")
μ½μμμ μλ κ²°κ³Όλ¬Όμ΄ λ³΄μ¬μΌν©λλ€.
---Example of linked list cow---
List1: 1 -> 2
List2: 1 -> 2
After appending 3 to list2
List1: 1 -> 2
List2: 1 -> 2 -> 3
Removing middle node on list2
List2: 1 -> 2 -> 3
μ κ±° μ°μ°μ λ μ΄μ μλνμ§ μμ΅λλ€. μ°λ¦¬κ° λ§λ μΉ΄μ°(COW)μ΅μ νμ κ·Έ μ΄μ κ° μμ΅λλ€. μλνλ©΄ λͺ¨λ λ³νμ λ Έλμ 볡μ¬λ³Έμ μΌμΌν¬ μ μκΈ° λλ¬Έμ, remove(after:) ꡬνμ μλͺ»λ λ Έλ μΈνΈμμ μ κ±°λ₯Ό μνν©λλ€. μ΄λ₯Ό μμ νκΈ° μν΄μλ copyNodes λ©μλμ νΉλ³ν λ²μ μ μμ±ν΄μΌ ν©λλ€. Sources λλ ν 리μ μμ±ν LinkedList.swift λ‘ λμκ°μ μλ λ΄μ©μ copyNodes λ©μλ μλμ μμ±ν©λλ€.
private mutating func copyNodes(returningCopyOf node: Node<Value>?) -> Node<Value>? {
guard !isKnownUniquelyReferenced(&head) else {
return nil
}
guard var oldNode = head else {
return nil
}
head = Node(value: oldNode.value)
var newNode = head
var nodeCopy: Node<Value>?
while let nextOldNode = oldNode.next {
if oldNode === node {
nodeCopy = newNode
}
newNode!.next = Node(value: nextOldNode.value)
newNode = newNode!.next
oldNode = nextOldNode
}
return nodeCopy
}
μ΄ λ©μλλ μ΄μ μ ꡬνν κ²κ³Ό λ§μ μ μ¬μ±μ 곡μ ν©λλ€. μ£Όμ μ°¨μ΄μ μ μ λ¬λ νλΌλ―Έν°λ₯Ό κΈ°λ°μΌλ‘ μλ‘κ² λ³΅μ¬λ λ Έλλ₯Ό λ°ννλ€λ κ²μ λλ€. remove(after:) λ©μλλ₯Ό μλμ κ°μ΄ μ λ°μ΄νΈν©λλ€.
@discardableResult
public mutating func remove(after node: Node<Value>) -> Value? {
guard let node = copyNodes(returningCopyOf: node) else { return nil }
defer {
if node.next === tail {
tail = node
}
node.next = node.next?.next
}
return node.next?.value
}
μ΄μ μ’μ μ λ§λ λ©μλλ₯Ό μ¬μ©νμ¬ μλ‘ λ³΅μ¬ν λ Έλμμ μ κ±°μ°μ°μ μνν©λλ€.
λ Έλ 곡μ
λλ²μ§Έ μ΅μ νλ λ Έλμ λΆλΆ 곡μ μ λλ€. κ²°κ³Όμ μΌλ‘ 볡μ¬λ₯Ό νΌν μ μλ νΉμ μλ리μ€κ° μμ΅λλ€. λͺ¨λ μλ리μ λν ν¬κ΄μ μΈ νκ°λ μ± μ λ²μλ₯Ό λ²μ΄λμ§λ§ κ΄λ ¨λ λ΄μ©μ λν μμ΄λμ΄λ₯Ό μ¬λ¬λΆμκ² μ 곡ν κ²μ λλ€.
μλ μμ λ₯Ό μ΄ν΄λ³΄μΈμ. (λ°λΌμ μμ±ν νμλ μμ΅λλ€.)
var list1 = LinkedList<Int>()
(1...3).forEach { list1.append($0) }
var list2 = list1
μΉ΄μ°(COW)κ° λΉνμ±νλ μνμμ list2 μμ νΈμ μ°μ°μ μνν κ²°κ³Όλ₯Ό κ³ λ €ν΄λ³΄μΈμ.
list2.push(0)
list1 μ΄ list2 μμ μνλ push μ°μ°μ μν₯μ λ°μκΉμ? μ΄ κ²½μ°μλ μλλλ€.
λ 리μ€νΈλ₯Ό μΆλ ₯νλ©΄ μλ κ²°κ³Όλ¬Όμ λ³΄κ² λ κ²μ λλ€.
List1: 1 -> 2 -> 3
List2: 0 -> 1 -> 2 -> 3
list1μ 100μ νΈμνλ μ΄ κ²½μ°λ μμ ν©λλ€.
list1.push(100)
μ§κΈ λ 리μ€νΈλ₯Ό μΈμνλ©΄ μλ κ²°κ³Όλ₯Ό λ³Ό μ μμ΅λλ€.
List1: 100 -> 1 -> 2 -> 3
List2: 0 -> 1 -> 2 -> 3
μ°κ²°λ¦¬μ€νΈμ μΌλ°©ν₯μ μΈ νΉμ±μ head-first μ½μ μ΄ “μΉ΄μ°(COW)μ λΆλ΄(tax)“μ 무μν μ μμμ μλ―Έν©λλ€.
ν΅μ¬μμ½ Key points
- μ°κ²°λ¦¬μ€νΈλ μ νμ μ΄κ³ μΌλ°©ν₯μ μ λλ€. λ νΌλ°μ€λ₯Ό μ΄λνλ μ¦μ λ€λ‘ λμκ° μ μμ΅λλ€.
- μ°κ²°λ¦¬μ€νΈλ head-first μ½μ μ κ²½μ° O(1) μκ°λ³΅μ‘λλ₯Ό κ°μ§λλ€. λ°°μ΄μ κ²½μ° O(n) μκ°λ³΅μ‘λλ₯Ό κ°μ§λλ€.
- Sequence μ Collection κ³Ό κ°μ μ€μννΈ μ½λ μ νλ‘ν μ½μ μ€μνλ©΄ μλμ μΌλ‘ λ§μ μ μ©ν λ©μλμ μ κ·Όν μ μμ΅λλ€.
- μΉ΄νΌ-μ¨-λΌμ΄νΈλ μ’μ μ±λ₯μ μ μ§νλ©΄μ λ°Έλ₯ μ맨ν±μ λ¬μ±νλλ‘ ν©λλ€.
π λ²μ μλ¦¬μ¦ λ§ν¬
0οΈβ£ μΉμ 0. μμνκΈ°μ μ
1οΈβ£ μΉμ 1. μκ° Introduction
> μ±ν° 1.μ μλ£κ΅¬μ‘°μ μκ³ λ¦¬μ¦μ λ°°μμΌν κΉμ? / μ±ν° 2. 볡μ‘λ Complexity
> μ±ν°3. μ€μννΈ νμ€ λΌμ΄λΈλ¬λ¦¬ Swift Standard Library
1οΈβ£ μΉμ 2. κΈ°μ΄ μλ£κ΅¬μ‘° Elementary Data Structure
> μ±ν° 4. μ€ν Stacks / μ±ν° 5. μ€ν λμ κ³Όμ Stack Challenges
> μ±ν° 6-1. μ°κ²°λ¦¬μ€νΈ Linked List (μ°κ²°λ¦¬μ€νΈ μ μ, μμ μΆκ°, μμ )
> μ±ν° 6-2. μ°κ²°λ¦¬μ€νΈ Linked List (μ€μννΈ νμ€ λΌμ΄λΈλ¬λ¦¬μ μ½λ μ νλ‘ν μ½, μΉ΄μ° Copy-On-Write, λ°Έλ₯ μ맨ν±)
> μ±ν° 7. μ°κ²°λ¦¬μ€νΈ λμ κ³Όμ Linked List Challenges
λ§μΉλ©°
μ€λλ μ½μ΄μ£Όμ μ κ°μ¬ν©λλ€.
κΆκΈν μ μ΄ μλ€λ©΄ λκΈλ‘, λμμ΄ λμ ¨λ€λ©΄ κ³΅κ° λΆνλ립λλ€.
νΉμ μμ νκ±°λ νΌλλ°±νμ€ λ΄μ© μλ€λ©΄ μΈμ λ λκΈλ‘ λΆνλ립λλ€.
κ°μ¬ν©λλ€.
λκΈ