learnings/Algorithm&DS

[DataStructure] ํ™˜ํ˜• ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋ฅผ Swift๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ

Une. 2024. 3. 26. 11:54

๊ธ€์€ ์ฑ… '๋‡Œ๋ฅผ ์ž๊ทนํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜' ์—์„œ ๋ฐฐ์šด ๋‚ด์šฉ์„ ์ ๊ทน ์ฐธ๊ณ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ, ๋ชจ๋“  ์ž๋ฃŒ๊ตฌ์กฐ ๋ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ Swift๋กœ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์Œ์„ ๋จผ์ € ์•Œ๋ฆฝ๋‹ˆ๋‹ค.

 

๋‡Œ๋ฅผ ์ž๊ทนํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ ์ž๋ฃŒ๊ตฌ์กฐ, ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์‚ฐ๊ณผ ๊ฐ™๋‹ค. ๋„˜์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ธฐ์— ์˜ค๋ฅด๊ณ  ๋˜ ์˜ค๋ฅด์ง€๋งŒ, ์ •์ƒ์„ ๋ฐŸ๊ธฐ๋ž€ ์‰ฝ์ง€ ์•Š๋‹ค. ๋ฐฐ์šฐ๊ธฐ๊ฐ€ ์–ด๋ ต๊ณ  ์žฌ๋ฏธ๋„ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ž˜์„œ ๋งŽ์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€

m.hanbit.co.kr

 

* ์ด์ „ ํฌ์ŠคํŒ…๊ณผ ์ด์–ด์ง‘๋‹ˆ๋‹ค!

 

[DataStructure] ์ด์ค‘ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋ฅผ Swift๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ

https://m.hanbit.co.kr/store/books/book_view.html?p_code=B3450156021 ์ด ๊ธ€์€ ์ฑ… '๋‡Œ๋ฅผ ์ž๊ทนํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜' ์—์„œ ๋ฐฐ์šด ๋‚ด์šฉ์„ ์ ๊ทน ์ฐธ๊ณ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ๋ชจ๋“  ์ž๋ฃŒ๊ตฌ์กฐ ๋ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ Swift๋กœ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์Œ์„

bpeeper.tistory.com

 

0. ์„œ๋ก 

๋ฆฌ์ŠคํŠธ ์ฒ˜์Œ์— ๋…ธ๋“œ๋ฅผ ์‚ฝ์ž…ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ, ๋ฆฌ์ŠคํŠธ ๋์— ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•  ๋•Œ O(1)์˜ ์ƒ์ˆ˜์‹œ๊ฐ„์œผ๋กœ ์ฒ˜๋ฆฌ๋  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋งŽ์€ ๋น„์šฉ์„ ์ค„์ผ ์ˆ˜ ์žˆ์„๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“  ์ ์€ ์—†์œผ์‹ ๊ฐ€์š”?
์ด์ „ ํฌ์ŠคํŒ…์˜ Vitamin ๋ฌธ์ œ์—์„œ ๋‹ค๋ค˜๋˜ '๋ฆฌ์ŠคํŠธ ์—ญ์ˆœ ์ถœ๋ ฅ' ๊ฐ™์€ ๊ฒฝ์šฐ์—๋„, ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๊นŒ์ง€ ์ ‘๊ทผํ•ด์•ผ ํ•˜๋Š” ๋น„์šฉ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค!
(์Šคํƒ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ „์ œ ํ•˜์— ๋ง์”€ ๋“œ๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค,,)

์ด์ œ ๋•Œ๊ฐ€ ๋„๋ž˜ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
๋ฆฌ์ŠคํŠธ์˜ head ํ”„๋กœํผํ‹ฐ ์ฒ˜๋Ÿผ, ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” tail ํ”„๋กœํผํ‹ฐ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•ด๋ณผ ๋•Œ๊ฐ€!

ํ˜น์‹œ ์šฐ๋กœ๋ณด๋กœ์Šค๋ฅผ ์•Œ๊ณ  ๊ณ„์‹œ๋‚˜์š”? ์ž์‹ ์˜ ๊ผฌ๋ฆฌ๋ฅผ ์‚ผํ‚ค๊ณ  ์žˆ๋Š” ๋ชจ์–‘์ด ๋งˆ์น˜ ์˜ค๋Š˜ ์•Œ์•„๋ณผ ํ™˜ํ˜• ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ ๊ฐ™๊ตฐ์š”!

์ „์„ค์˜ ๋ฑ€ ์šฐ๋กœ๋ณด๋กœ์Šค

1. ๊ตฌ์กฐ์ •์˜

์ฒซ ๋…ธ๋“œ๊ฐ€ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๊ฐ€ ์ฒซ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋ผ์žˆ๊ณ , ๊ทธ ๋ฐ˜๋Œ€๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ธ ํ˜•ํƒœ๋ฅผ ๋„๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ฒซ ๋…ธ๋“œ๋ฅผ head, ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋ฅผ tail์ด๋ผ๊ณ  ํ•˜๊ณ  ๋‚˜๋จธ์ง€๋Š” ์ด์ค‘ ๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ์—์„œ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์™€๋„ ๋ฌด๋ฐฉํ•˜๊ฒ ๊ตฐ์š”!

2. ๊ตฌํ˜„

class CircularLinkedList<T>{
    fileprivate var head: DoublyNode<T>?
    fileprivate weak var tail: DoublyNode<T>?
    deinit {
        var currentNode = self.head
        while(currentNode != nil){
            currentNode?.nextNode = nil
            currentNode = currentNode?.prevNode
        }
    }
}

deinit ๋ฉ”์†Œ๋“œ ๋‚ด๋ถ€์˜ ์ฝ”๋“œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ๋„ฃ์€ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

3. ์‚ฝ์ž…

    ///๋ฆฌ์ŠคํŠธ์˜ ์ฒ˜์Œ์— ๋…ธ๋“œ ์ถ”๊ฐ€
    func inertAtFirst(_ newNode: DoublyNode<T>){
        if self.head == nil{
            self.head = newNode
            self.tail = newNode
            return
        }

        self.head?.prevNode = newNode
        self.tail?.nextNode = self.head?.prevNode
        newNode.prevNode = self.tail
        newNode.nextNode = self.head
        self.head = newNode

    }
    //๋ฆฌ์ŠคํŠธ์˜ ํŠน์ • ์œ„์น˜์— ๋…ธ๋“œ ์‚ฝ์ž…
    @discardableResult
    func insertAt(_ idx: Int, _ newNode: DoublyNode<T>)->DoublyNode<T>?{
        if self.head == nil {return nil}
        
        var currentNode = self.head
        for _ in 0..<idx{
            if currentNode == nil {return nil}
            currentNode = currentNode?.nextNode
        }
        
        currentNode?.prevNode?.nextNode = newNode
        currentNode?.prevNode = currentNode?.prevNode?.nextNode

        newNode.prevNode = currentNode?.prevNode
        newNode.nextNode = currentNode
        
        return newNode
    }
    ///๋ฆฌ์ŠคํŠธ์˜ ๋งˆ์ง€๋ง‰์— ๋…ธ๋“œ ์ถ”๊ฐ€
    func insertAtLast(_ newNode: DoublyNode<T>){
        if self.head == nil {
            self.head = newNode
            self.tail = newNode
//            head?.prevNode = newNode
//            tail?.nextNode = newNode
            return
        }
        newNode.prevNode = self.tail //prevNode๋Š” weak๋ผ rf ์ฆ๊ฐ€ ์•ˆํ•œ๋‹ค
        newNode.nextNode = self.tail?.nextNode //rf 1 ์ฆ๊ฐ€, newNode.nextNode = self.head์‹œ head์— ๋Œ€ํ•œ rf๊ฐ€ ์ฆ๊ฐ€ํ•จ
        self.tail!.nextNode = newNode //์ƒˆ ๋…ธ๋“œ์˜ rf 1 ์ฆ๊ฐ€
        self.tail = newNode //tail์€ weak๋ผ rf ์ฆ๊ฐ€ ์•ˆํ•œ๋‹ค
    }

๋ณ„๋‹ค๋ฅผ๊ฒŒ ์—†๋Š” ์ฝ”๋“œ ์ž…๋‹ˆ๋‹ค๋งŒ,,
์ด์ œ tail ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•ด ๋ฆฌ์ŠคํŠธ์˜ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ์— ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์–ด ๋งˆ์ง€๋ง‰์— ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋น„์šฉ์ด O(n)์—์„œ O(1)๋กœ ์ ˆ์•ฝ๋์Œ์„ ์•Œ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

4. ์‚ญ์ œ

    ///๋ฆฌ์ŠคํŠธ์˜ ์ฒ˜์Œ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œ
    @discardableResult
    func removeFirst()->DoublyNode<T>?{
        if self.head == nil{
            return nil
        }
        var removeNode = self.head
        self.head = self.head?.nextNode
        self.head?.prevNode = self.tail
        self.tail?.nextNode = self.head
        return removeNode
    }
    ///๋ฆฌ์ŠคํŠธ์˜ ํŠน์ • ์œ„์น˜ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œ
    @discardableResult
    func removeAt(_ idx: Int)->DoublyNode<T>?{
        if self.head == nil {return nil}
        var removeNode = self.head
        for _ in 0..<idx{
            if removeNode?.nextNode == nil {return nil}
            removeNode = removeNode?.nextNode
        }
        removeNode?.nextNode?.prevNode = removeNode?.prevNode
        removeNode?.prevNode?.nextNode = removeNode?.nextNode
        return removeNode
    }

์‚ฝ์ž…๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ ์‚ญ์ œ ๋˜ํ•œ O(1)์˜ ๋น„์šฉ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

5. ํƒ์ƒ‰

    ///๋ฆฌ์ŠคํŠธ๋‚ด ํŠน์ • ์œ„์น˜์˜ ๋…ธ๋“œ ๋ฐ˜ํ™˜
    @discardableResult
    func getNodeAt(_ idx: Int) -> DoublyNode<T>?{
        if self.head == nil { return nil}
        var currentNode = self.head
        for _ in 0..<idx{
            if currentNode == nil {return nil}
            currentNode = currentNode?.nextNode
        }
        return currentNode
    }

๋”์ด์ƒ ๋“œ๋ฆด ์ˆ˜ ์žˆ๋Š” ๋ง์ด ์—†์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ, ๋ ๋…ธ๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์ง์ ‘ ์ œ์ž‘ํ•ด๋ณด์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค!

6. ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์™€ Swift์˜ ๋ฐฐ์—ด ๋น„๊ต

์ž, ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์™€ ํ†ต์ƒ์ ์œผ๋กœ ์•Œ๋ ค์ง„ ๊ฐ„๋‹จํžˆ ๋น„๊ตํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

  ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ ๋ฐฐ์—ด
๋ฉ”๋ชจ๋ฆฌ์— ์—ฐ์†์ ์œผ๋กœ ์ €์žฅ๋˜์–ด ์žˆ๋Š”๊ฐ€? X O
๋‹ค์Œ ์ž๋ฃŒ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ธฐ ์œ„ํ•œ ์ถ”๊ฐ€์ ์ธ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ๊ฐ€? O X
ํŠน์ • ์œ„์น˜์˜ ์ž๋ฃŒ๋ฅผ ์–ป๊ธฐ ์œ„ํ•œ ๋น„์šฉ์€ ์–ผ๋งˆ์ธ๊ฐ€? ํ‰๊ท ์ ์œผ๋กœ O(n), ๊ฒฝ์šฐ์— ๋”ฐ๋ผ O(1) O(1)
์š”์†Œ๋ฅผ ์ถ”๊ฐ€/์‚ญ์ œํ•จ์— ๋”ฐ๋ผ ๋ฐœ์ƒํ•˜๋Š” ๋นˆ ๊ณต๊ฐ„์˜ ๊ด€๋ฆฌ๊ฐ€ ์šฉ์ดํ•œ๊ฐ€? O X

๋น„๊ตํ• ๊ฑฐ๋ฆฌ๋Š” ๋” ๋งŽ๊ฒ ์Šต๋‹ˆ๋‹ค๋งŒ, ๊ฐ ์ž๋ฃŒ๊ตฌ์กฐ์— ๋”ฐ๋ผ ์žฅ๋‹จ์ ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ๋ง์ž…๋‹ˆ๋‹ค, ํ˜น์‹œ ์—ฌ๋Ÿฌ๋ถ„์€ C, C++์™€ Swift์—์„œ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•ด ๋ณธ ๊ฒฝํ—˜์ด ์žˆ์œผ์‹ ๊ฐ€์š”? ์ €๋Š” ์žˆ๋‹ต๋‹ˆ๋‹ค!
์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐฐ์—ด์€ ๊ทธ ํฌ๊ธฐ๋ฅผ ์†Œ์Šค์ฝ”๋“œ ๋ ˆ๋ฒจ์—์„œ ์ง€์ •ํ•˜๊ฑฐ๋‚˜, C๊ณ„์—ด์˜ ๊ฒฝ์šฐ์— malloc ๋“ฑ์œผ๋กœ ํ•„์š”ํ•œ ํฌ๊ธฐ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ Swift์—์„œ๋Š” ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ๋“ฑ์˜ ์ž‘์—…์„ ํ•œ ๊ธฐ์–ต์€ ์—†๊ตฐ์š”. ์–ด๋–ป๊ฒŒ ๋œ ์ผ์ผ๊นŒ์š”?

//type var_name[demension], c++์˜ Array ์ƒ์„ฑ
int arr[10];
//var var_name: [Element] = [], Swift์˜ Array ์ƒ์„ฑ
var arr: [Int] = []


์ž์ž, ๋‹ค๋ฅธ๊ณณ ๊ธฐ์›ƒ๊ฑฐ๋ฆด ํ•„์š” ์—†์ด ๊ณต์‹๋ฌธ์„œ๋ฅผ ์‚ดํ”ผ๋ฉฐ ํ™•์ธํ•ด๋ณผ๊นŒ์š”?
(Swift์˜ ๊ณต์‹๋ฌธ์„œ์™€ Apple์˜ ๊ณต์‹๋ฌธ์„œ ๋‘๊ณณ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, Apple์ชฝ ๋ฌธ์„œ์˜ ์„ค๋ช…์ด ๋” ์ ํ•ฉํ•˜๋‹ค๊ณ  ํŒ๋‹จํ•˜์˜€์Šต๋‹ˆ๋‹ค.)

ํ•ด๋‹น ๋ฌธ์„œ์—์„œ ์œ ์ผํ•˜๊ฒŒ ์˜ˆ์ œ์ฝ”๋“œ ์—†์ด ๋ง๋กœ๋งŒ ์„ค๋ช…ํ•˜๊ณ  ์žˆ๋Š” ๋ถ€๋ถ„์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

Every array reserves a specific amount of memory to hold its contents. When you add elements to an array and that array begins to exceed its reserved capacity, the array allocates a larger region of memory and copies its elements into the new storage. This exponential growth strategy means that appending an element happens in constant time, averaging the performance of many append operations. Append operations that trigger reallocation have a performance cost, but they occur less and less often as the array grows larger.

Swift์—์„œ ๋ชจ๋“  ๋ฐฐ์—ด์€ ์ปจํ…์ธ ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ํŠน์ •ํ•œ ํฌ๊ธฐ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฐ€์ง€๋ฉฐ, ์ƒˆ ์š”์†Œ๋ฅผ append ํ•  ๋•Œ ๊ธฐ์กด ํฌ๊ธฐ๋ฅผ ๋„˜์–ด์„œ๋ฉด ๊ทธ ํฌ๊ธฐ์˜ ๋‘๋ฐฐ์˜ ์ƒˆ ๊ณต๊ฐ„์„ ํ™•๋ณดํ•œ ํ›„ ์ด๊ณณ์œผ๋กœ ๊ธฐ์กด ๋ฐฐ์—ด์„ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐํ•˜๊ธ‰์ˆ˜์  ์ฆ๊ฐ€ ์ „๋žต์€, ํ‰๊ท ์ ์œผ๋กœ ์š”์†Œ์˜ ์ถ”๊ฐ€ ์ƒ์ˆ˜์‹œ๊ฐ„ ์•ˆ์— ์ผ์–ด๋‚˜๋Š”๊ฒƒ์„ ๋œปํ•˜๋ฉฐ, ๋ฉ”๋ชจ๋ฆฌ ์žฌํ• ๋‹น์— ๋Œ€ํ•œ ์ˆ˜ํ–‰๋น„์šฉ์€ ๋ฐœ์ƒํ•˜๋‚˜ ๋ฐฐ์—ด์ด ์ปค๊ฐ์— ๋”ฐ๋ผ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.

์š”์ปจ๋Œ€, ๋ฐฐ์—ด์ด ๊ฝ‰ ์ฐจ๋ฉด ์Šค์Šค๋กœ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ์žฌํ• ๋‹น์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ ํฌ๊ธฐ๋ฅผ ๊ณ„์† ๋Š˜๋ ค๋‚˜๊ฐ€๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ทจํ•˜๊ณ  ์žˆ๊ตฐ์š”.
๊ทธ๋ ‡๋‹ค๋ฉด ์‚ฝ์ž…, ์‚ญ์ œ ๋“ฑ์ด ํ†ต์ƒ์˜ ๋ฐฐ์—ด๋ณด๋‹ค ์šฉ์ดํ•  ์ˆ˜ ์žˆ๊ฒ ๋„ค์š”?
๋งž์Šต๋‹ˆ๋‹ค! ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ๋ณด๊ณ  ์˜ค์…จ๋‹ค๋ฉด ์ด๋ฏธ ์•„์‹œ๊ฒ ์ง€๋งŒ, Swift์˜ ๋ฐฐ์—ด์€ ๋งˆ์น˜ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์ฒ˜๋Ÿผ ์‚ฝ์ž…, ์‚ญ์ œ ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค!

var array:[Int] = []

let first = array.first!
let last = array.last!
array.append(1)
array.removeLast()
array.insert(1, at: 1)
array.remove(at: 1)
array.removeAll()


๋” ์ž์„ธํ•œ Swift ๋ฐฐ์—ด์˜ ๋‚ด์šฉ์€ ๋ณ„๋„์˜ ํฌ์ŠคํŒ…์„ ์ž‘์„ฑํ•˜์—ฌ ๋ฐฐ์—ด์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋Š”๊ฒƒ์œผ๋กœ ์ด์ฏค ๋งˆ๋ฌด๋ฆฌ ์ง“๊ฒ ์Šต๋‹ˆ๋‹ค.
ํ ... Swift์—์„œ๋Š” ๊ตณ์ด ๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ตฌํ˜„ํ•  ํ•„์š”๊ฐ€ ์—†์–ด ๋ณด์ด๋Š”๊ตฐ์š”... T_T
์†๊ฐ€๋ฝ ์•„ํŒ ๋˜ ์ง€๊ธˆ๊นŒ์ง€์˜ ๊ณต๋ถ€๋Š” ์˜๋ฏธ๊ฐ€ ์—†๋˜ ๊ฑธ๊นŒ์š”?

7. ๋งˆ๋ฌด๋ฆฌ

๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋ฅผ ์†์ˆ˜ ๊ตฌํ˜„ํ•˜๊ณ , ์‚ฝ์ž…์ด๋‚˜ ์‚ญ์ œ๋“ฑ์˜ ์—ฐ์‚ฐ์„ ์ง์ ‘ ๊ณ ์•ˆํ•ด๋ณด๋ฉด์„œ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ์ถ”๊ฐ€/์‚ญ์ œ๊ฐ€ ๋ฐฐ์—ด๋ณด๋‹ค ์šฉ์ดํ•˜๋„๋ก ๊ณ ์•ˆ๋˜์—ˆ๊ณ  ๋™์ž‘ํ•˜๋Š”์ง€, ํƒ์ƒ‰/์‚ฝ์ž…/์‚ญ์ œ ๋“ฑ์˜ ์—ฐ์‚ฐ์ด ์™œ ํ†ต์ƒ์ ์œผ๋กœ O(n)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๋ฉฐ ํŠน์ • ๊ฒฝ์šฐ์—์„œ O(1)์˜ ์ƒ์ˆ˜์‹œ๊ฐ„์„ ๊ฐ€์ง€๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
Xcode๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค ๋ณด๋ฉด ์˜ค๋ฅธ์ชฝ Quick Help์ฐฝ์„ ์ž์ฃผ ๋ณด์‹คํ…๋ฐ์š”! ์ด๊ณณ์— ๊ทธ๋™์•ˆ ๊ณต๋ถ€ํ–ˆ๋˜ ๋‚ด์šฉ์ด ๋„์›€์ด ๋  ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
Swift์˜ ๋ฐฐ์—ด์—์„œ insert๋‚˜ remove ํ•จ์ˆ˜์˜ ๋ฌธ์„œ๋ฅผ ๋งˆ์ง€๋ง‰๊นŒ์ง€ ์ฝ์–ด ๋ณด๋ฉด, Complexity๋กœ ํ•ด๋‹น ํ•จ์ˆ˜์˜ ๋น„์šฉ์„ ์•ˆ๋‚ดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ณต๋ถ€ํ•˜๋ฉฐ ์ž์ฃผ ๋ณด์•˜๋˜ O(n)์„ Swift ๋ฐฐ์—ด์˜ Complexity์—์„œ๋„ ๋ณผ ์ˆ˜ ์žˆ๊ตฐ์š”!
์ด์ œ O(n)์˜ ๋น„์šฉ์ด ๋“œ๋Š” ์ด์œ ๋ฅผ ์กฐ๊ธˆ ์•Œ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค! ๋น„๋ก ๋‚ด๋ถ€์ ์ธ ๊ตฌํ˜„์ด ์–ด๋–ป๊ฒŒ ์ด๋ฃจ์–ด์ ธ ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์ง€๋งŒ ๋ง์ด์ฃ 

์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์— ๋˜ ๋งŒ๋‚˜์š”!