Raywenderlich.com ์์ ๋์จ Data Structures & Algorithms in Swift ์ฑ ์ ๋ฐ๋ชจ ๊ณต๊ฐ๋ณธ์ ๋ฒ์ญํ์์ต๋๋ค. ์ฆ๊ฒ๊ฒ ๋ด์ฃผ์ธ์.
https://www.raywenderlich.com/books/data-structures-algorithms-in-swift
์น์ 1. ์๊ฐ Introduction
์ฑํฐ3. ์ค์ํํธ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ Swift Standard Library
์ค์ํํธ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ค์ํํธ ์ธ์ด์ ํต์ฌ ๊ตฌ์ฑ์์๋ฅผ ํฌํจํ๋ ํ๋ ์์ํฌ์ ๋๋ค. ์ด ์์๋ ์ค์ํํธ ์ฑ์ ๊ตฌ์ถํ๋๋ฐ ๋์์ด ๋๋ ๋ค์ํ ํด๊ณผ ํ์ ์ด ์์ต๋๋ค. ์ฌ์ฉ์ ์ ์ ์๋ฃ๊ตฌ์กฐ(your own custom data structure)๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ ์, ์ค์ํํธ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ด๋ฏธ ์ ๊ณตํ๋ ๊ธฐ๋ณธ ์๋ฃ ๊ตฌ์กฐ๋ฅผ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
์ด๋ฒ ์ฑํฐ์์๋ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ ๊ณตํ๋ ์ธ๊ฐ์ง ์ฃผ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ธ Array, Dictionary, Set ์ ์ค์ ์ ๋ ๊ฒ์ ๋๋ค.
๋ฐฐ์ดArray
๋ฐฐ์ด์ ๋ฒ์ฉ์ ์ผ๋ฐ ์ปจํ ์ด๋๋ก ์ ๋ ฌ๋ ์์๋ค์ ์ปฌ๋ ์ ์ ์ ์ฅํ๋ฉฐ, ์ค์ํํธ ํ๋ก๊ทธ๋จ์์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค. ๋๊ดํธ๋ก ๋๋ฌ์ผ, ์ผํ๋ก ๊ตฌ๋ถํ ๊ฐ๋ค์ ๋ชฉ๋ก์ธ ๋ฐฐ์ด ๋ฆฌํฐ๋ด array literal ์ ์ด์ฉํ์ฌ ๋ฐฐ์ด์ ์์ฑํ ์ ์์ต๋๋ค. ์๋์ ์๋ฅผ ํ์ธํด๋ณด์ธ์.
let people = ["Brian", "Stanley", "Ringo"]
์ค์ํํธ๋ ํ๋กํ ์ฝ์ ์ด์ฉํ์ฌ ๋ฐฐ์ด์ ์ ์ํฉ๋๋ค. ์ด ๊ฐ ํ๋กํ ์ฝ์ ๋ฐฐ์ด์ ๋ ๋ง์ ๊ธฐ๋ฅ์ ๋ถ์ฌํฉ๋๋ค. ์๋ฅผ ๋ค์ด ๋ฐฐ์ดArray ์ ์ํ์คSequence ์ ๋๋ค. ์ด ๋ง์ ํ๋ฒ ์ด์ ๋ฐ๋ณตํ ์ ์๋ค๋ ๋ป์ ๋๋ค. ๋ํ ๋ฐฐ์ด์ ์ฝ๋ ์ Collection ์ ๋๋ค. ์ด ๋ป์ ๋นํ๊ดด์ ์ผ๋ก(nondestructively) ์ฌ๋ฌ๋ฒ ์ํํ ์ ์๊ณ , ์ฒจ์ ์ฐ์ฐ์(subscript oerator)๋ฅผ ์ด์ฉํ์ฌ ์ ๊ทผํ ์ ์์ต๋๋ค. ๋ฐฐ์ด์ ๋ํ ํจ์จ์ฑ์ ๋ณด์ฅํ๋ RandomAccessCollection ์ด๊ธฐ๋ ํฉ๋๋ค.
์ค์ํํธ์ ๋ฐฐ์ดArray์ ์ ๋ค๋ฆญ ์ปฌ๋ ์ generic collection ์ผ๋ก๋ ์๋ ค์ ธ ์์ต๋๋ค. ์ด๋ค ํ์ ์์๋ ์๋ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ค์ ๋ก ๋๋ถ๋ถ์ ์ค์ํํธ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ ๋ค๋ฆญ ์ฝ๋๋ก ๊ตฌ์ถ๋์ด ์์ต๋๋ค.
๋ชจ๋ ์๋ฃ๊ตฌ์กฐ์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฌ๋ฌ๋ถ์ด ์์์ผ ํ๋ ํน์ฑ์ด ์์ต๋๋ค. ์ฒซ๋ฒ์งธ๋ ๋ฐ๋ก ์์order ์ ๊ฐ๋ ์ ๋๋ค.
์์ Order
๋ฐฐ์ด์ ์์๋ ๋ช ์์ ์ผ๋ก ์ ๋ ฌ๋์ด ์์ต๋๋ค. ์์ people ๋ฐฐ์ด์ ์์๋ก ๋ค์๋ฉด, "Brian" ์ "Stanley" ์ ์์ ์ต๋๋ค.
๋ฐฐ์ด์ ์์๋ค์ ๋ชจ๋ 0 ๊ธฐ๋ฐ์ ์ ์ ์ธ๋ฑ์ค๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด people ๋ฐฐ์ด์ 3๊ฐ์ ์ธ๋ฑ์ค๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๊ฐ๊ฐ ์์์ ๋์๋ฉ๋๋ค. ์๋์ ๊ฐ์ด ์์ฑํด์ ๋ฐฐ์ด์ ์์๊ฐ์ ๊ฒ์ํ ์ ์์ต๋๋ค.
people[0] // "Brian"
people[1] // "Stanley"
people[2] // "Ringo"
๋ฐฐ์ด์ ์๋ฃ๊ตฌ์กฐ์์ ์์๊ฐ ์ ์๋๋ฉฐ ์ด ๊ฐ๋ ์ ๋น์ฐํ๊ฒ ์ฌ๊ฒจ์๋ ์๋ฉ๋๋ค. ๋์ ๋๋ฆฌ Dictionary ์ ๊ฐ์ ์ผ๋ถ ์๋ฃ๊ตฌ์กฐ๋ ์์์ ๋ํ ๊ฐ๋ ์ด ์ฝํฉ๋๋ค.
๋๋ค ์ก์ธ์คRandom-access
๋๋ค ์ก์ธ์คRandom-access ๋ ์ ํด์ง ์๊ฐ์ ์์๊ฒ์์ ์ฒ๋ฆฌํ ์ ์์ ๊ฒฝ์ฐ ๊ฑฐ๋ก ํ ์ ์๋ ํน์ฑ์ ๋๋ค. ์๋ฅผ ๋ค์ด people ๋ฐฐ์ด์์ "Ringo" ๋ผ๋ ์์๋ฅผ ๊ฐ์ ธ์ค๋๋ฐ๋ ์ผ์ ํ ์๊ฐ์ด ๊ฑธ๋ฆฝ๋๋ค. ๋ค์ ๋งํด์ ์ด ์ฑ๋ฅ์ ๋น์ฐํ๊ฒ ์ฌ๊ฒจ์๋ ์๋ฉ๋๋ค. ์ฐ๊ฒฐ๋ฆฌ์คํธ linked list ๋ ํธ๋ฆฌ tree๋ ์ผ์ ํ ์๊ฐ๋์ ์ ๊ทผ(constant time access)ํ๋ ๊ถํ์ด ์์ต๋๋ค.
๋ฐฐ์ด์ ์ฑ๋ฅ Array performance
๋๋ค ์ก์ธ์ค ์ธ์๋ ๋ค๋ฅธ ์ฑ๋ฅ ์์ญ๋ค์ ์ฌ๋ฌ๋ถ๋ค์ด ๊ฐ๋ฐ์๋ก์ ๊ด์ฌ์ ๊ฐ์ง ์์ญ์ ๋๋ค. ํนํ๋ ๋ฐ์ดํฐ์ ์์ด ์ฆ๊ฐํ ๋ ์๋ฃ๊ตฌ์กฐ๊ฐ ์ผ๋ง๋ ์ ์๋ํ๋์ง ํน์ ์๋ํ์ง ์๋์ง ๋ง์ ๋๋ค. ๋ฐฐ์ด์ ๊ฒฝ์ฐ ๋๊ฐ์ง ์์ธ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค.
์ฝ์ ์์น Insertion location
์ฒซ๋ฒ์งธ ์์ธ์, ์๋ก์ด ์์๋ฅผ ๋ฐฐ์ด ์ด๋์ ์ฝ์ ํ ์ง ๊ฒฐ์ ํ๋ ๊ฒ์ ๋๋ค. ๊ฐ์ฅ ํจ์จ์ ์ธ ์๋๋ฆฌ์ค๋ ์๋ก์ด ์์๋ฅผ ์ถ๊ฐํ ๋ ๋ฐฐ์ด ๊ฐ์ฅ ๋ค์ ์ถ๊ฐํ๋ ๊ฒ์ ๋๋ค.
people.append("Charles")
print(people) // prints ["Brian", "Stanley", "Ringo", "Charles"]
append ๋ฉ์๋๋ฅผ ์ด์ฉํ์ฌ "Charles" ๋ฅผ ์ฝ์ ํ๋ฉด ๋ฐฐ์ด์ ๊ฐ์ฅ ๋์ ์์นํ๊ฒ ๋ฉ๋๋ค. ์ด๋ฅผ ์์์๊ฐ constant-time ์์ ์ด๋ผ๊ณ ํฉ๋๋ค. ์ด๋ ๋ฐฐ์ด์ด ์ผ๋ง๋ ์ปค์ง๋ ์๊ด์์ด ์์ ์ด ์ํํ๋๋ฐ ๋์ผํ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค๋ ๋ป์ ๋๋ค. ํ์ง๋ง ๋ฐฐ์ด์ ํ ์ค๊ฐ๊ณผ ๊ฐ์ด ํน์ ์์น์ ์์๋ฅผ ์ฝ์ ํด์ผ๋ ๋๋ ์์ต๋๋ค.
์ด ์ผ์ด์ค๊ฐ ์ ์๊ธฐ๋์ง ์ค๋ช ํ๊ธฐ ์ํด ์๋์ ์ ์ถ๋ฅผ ์๊ฐํด๋ด ์๋ค. ๊ทน์ฅ์์ ์ฌ๋ฌ๋ถ์ ์ค์ ์์ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ต๋๋ค. ์ด ๋ ์๋ก์ด ์ฌ๋์ด ์์ ์ค์ ์๋ ค๊ณ ํฉ๋๋ค. ์ฌ๊ธฐ์ ๊ฐ์ฅ ๊ฐํธํ ์์น๊ฐ ์ด๋๊น์? ๋น์ฐํ ๋ฐ๋ก ๋ง์ง๋ง์ด์ฃ .
์๋ก์จ ์ฌ๋์ด ์ค์ ๊ฐ์ด๋ฐ ๋ผ์ด๋ค๋ ค๊ณ ํ๋ค๋ฉด, ๊ทธ ์ค์ ์๋ ์ฌ๋ ์ค ์ ๋ฐ์ ์ค๋ํด์ ๊ณต๊ฐ์ ๋ง๋ค๋๋ก ํด์ผํ ๊ฒ์ ๋๋ค.
๋ง์ฝ ๊ทธ ์๋ก์จ ์ฌ๋์ด ๋งค์ฐ ๋ฌด๋กํ๋ค๋ฉด ์ค์ ๋งจ ์์ ๋ผ์ด๋ค๋ ค๊ณ ํ ๊ฒ์ ๋๋ค. ์ต์ ์ ์๋๋ฆฌ์ค์ ๋๋ค. ์๋ํ๋ฉด ์ค์ ์ ์๋ ๋ชจ๋ ์ฌ๋๋ค์ด ์๋ก์จ ์ฌ๋์ ์ํ ๋งจ ์์๋ฆฌ๋ฅผ ๋ง๋ค๊ธฐ ์ํด ๋ค๋ก ์ด๋ํด์ผํ๋๊น์.
์ด๊ฒ ๋ฐ๋ก ๋ฐฐ์ด์ด ์๋ํ๋ ์๋ฆฌ์ ๋๋ค. ์๋ก์ด ์์๋ฅผ ๋ฐฐ์ด์ ๊ฐ์ฅ ๋์ด ์๋ ๋ค๋ฅธ ๊ณณ์ ์ฝ์ ํ๋ค๋ฉด ๊ธฐ์กด์ ์์๋ค์ ์์น๋ฅผ ๋ค๋ก ๊ต์ฒดํด์ผํฉ๋๋ค.
people.insert("Andy", at: 0)
// ["Andy", "Brian", "Stanley", "Ringo", "Charles"]
์ ํํ๊ฒ ํ์๋ฉด ๋ชจ๋ ์์๋ ๋ฐ๋์ ์ธ๋ฑ์ค ํ๋๋งํผ ๋ค๋ก ์ด๋ํด์ผํฉ๋๋ค. n ๋ฒ์ ๋จ๊ณ๊ฐ ํ์ํฉ๋๋ค. ๋ง์ฝ ๋ฐฐ์ด์ ์์๊ฐ ๋๋ฐฐ๋ผ๋ฉด ์ฝ์ insert ์์ ์๋ ๋๋ฐฐ์ ์๊ฐ์ด ๋ญ๋๋ค.
๋ง์ฝ ์์๋ฅผ ๋ฐฐ์ด์ ๋งจ ์์ ์ฝ์ ํ๋ ๊ฒ์ด ์ฌ๋ฌ๋ถ ํ๋ก๊ทธ๋จ์ ์ผ๋ฐ์ ์ธ ์์ ์ด๋ผ๋ฉด, ๋ฐ์ดํฐ๋ฅผ ์ ์งํ๊ธฐ ์ํด์ ๋ค๋ฅธ ์๋ฃ๊ตฌ์กฐ๋ฅผ ๊ณ ๋ คํด๋ด์ผ ํ ๊ฒ์ ๋๋ค.
์ฝ์ ์ ์๋๋ฅผ ๊ฒฐ์ ํ๋ ๋๋ฒ์งธ ์์๋ ๋ฐฐ์ด์ ์ฉ๋capacity ์ ๋๋ค. ๋ณด์ด์ง ์์ง๋ง(underneath the hood) ์ค์ํํธ์ ๋ฐฐ์ด์ ์์ ์์๋ฅผ ์ํ ๊ณต๊ฐ์ ๋ฏธ๋ฆฌ ๊ฒฐ์ ํ์ฌ ํ ๋น๋ฉ๋๋ค. ์ด๋ฏธ ์ต๋ ์ฉ๋์ธ ๋ฐฐ์ด์ ์๋ก์ด ์์๋ฅผ ์ถ๊ฐํ๋ค๋ฉด ๋ฐฐ์ด์ ๋ ๋ง์ ๊ณต๊ฐ์ ๋ง๋ค๊ธฐ ์ํด ์ฌ๊ตฌ์กฐํ ํด์ผํฉ๋๋ค. ๋ฐฐ์ด์ ๊ธฐ์กด ์์๋ค์ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ์์ผ๋ก ๋ ํฐ ์ ์ปจํ ์ด๋์ ๋ณต์ฌํ๋ ๊ฒ์ ๋๋ค. ํ์ง๋ง ์ด๊ฒ์ ๋ฐฐ์ด์ ๊ฐ ์์์ ์ ๊ทผํ๊ณ ๋ณต์ฌํ๋ ๋น์ฉ์ด ๋ฐ์ํฉ๋๋ค.
์ด๋ค ์ฝ์ ์ด๋ , ์ฌ์ง์ด ๋์ ์ฝ์ ํ๋๋ผ๋, ์ฌ๋ณธ์ด ๋ง๋ค์ด์ง๋ ์๊ฐ n ๊ฐ์ ๋จ๊ณ๊ฐ ๊ฑธ๋ฆฐ๋ค๋ ๊ฒ์ ๋๋ค. ํ์ง๋ง ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ด ๋ณต์ฌ๊ฐ ๋ฐ์ํ ๋ ํ์ํ ์๊ฐ์ ์ต์ํํ๋ ์ ๋ต์ ์ฐจ์ฉํ๊ณ ์์ต๋๋ค. ์คํ ๋ฆฌ์ง๊ฐ ๋ถ์กฑํ์ฌ ๋ณต์ฌ๋ฅผ ํํ ๋๋ง๋ค, ์ฉ๋์ ๋๋ฐฐ๋ก ๋์ด๋ฉ๋๋ค.
๋์ ๋๋ฆฌ Dictionary
๋์ ๋๋ฆฌ๋ ํค-๊ฐkey-value ์ ์์ ๊ฐ์ง๊ณ ์๋ ๋ ๋ค๋ฅธ ์ ๋ค๋ฆญ ์ฝ๋ ์ ์ ๋๋ค. ์๋ฅผ ๋ค์ด ์ฌ์ฉ์์ ์ด๋ฆ๊ณผ ์ค์ฝ์ด๋ฅผ ๋ณด์ ํ๋ ๋์ ๋๋ฆฌ๊ฐ ์์ต๋๋ค.
var scores: [String: Int] = ["Eric": 9, "Mark": 12, "Wayne": 1]
๋์ ๋๋ฆฌ๋ ์์๋ฅผ ๋ณด์ฅํ์ง ์๊ณ , ํน์ ํ ์ธ๋ฑ์ค์ ์ฝ์ ํ ์๋ ์์ต๋๋ค. ๋ํ ํค Key ํ์ ์ด ํด์ ๊ฐ๋ฅ Hashable ํด์ผ ํฉ๋๋ค. ๋คํํ๋ ๊ฑฐ์ ๋๋ถ๋ถ์ ํ์ค ํ์ ์ ํด์๊ฐ๋ฅ Hashable ํ๋ฉฐ, ์ต๊ทผ ๋ฒ์ ์ ์ค์ํํธ์์ Hashable ํ๋กํ ์ฝ์ ์ฑํํ๋ ๊ฒ์ ๋์๋กญ์ง ์์ ์ผ์ด ๋์์ต๋๋ค. ์๋ ๊ตฌ๋ฌธ์ ์ด์ฉํ์ฌ ๋์ ๋๋ฆฌ์ ์ ํญ๋ชฉ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
scores["Andrew"] = 0
๋์ ๋๋ฆฌ ๋ด์ ์๋ก์ด ํค-๊ฐ ์์ ์์ฑํฉ๋๋ค.
["Eric": 9, "Mark": 12, "Andrew": 0, "Wayne": 1]
"Andrew" ํค๋ ๋์ ๋๋ฆฌ์ ์ด๋๊ฐ์ ์ฝ์ ๋์ด ์์ต๋๋ค. ๋์ ๋๋ฆฌ๋ ์์๊ฐ ์ง์ ๋์ง ์์ผ๋ฏ๋ก ์ ํญ๋ชฉ์ด ์ด๋์ ๋ค์ด๊ฐ๋์ง ๋ณด์ฅํ ์ ์์ต๋๋ค.
Collection ํ๋กํ ์ฝ์ด ๊ฐ๋ฅํ๋ฏ๋ก, ๋์ ๋๋ฆฌ์ ํค-๊ฐ์ ์ฌ๋ฌ๋ฒ ์ํํ๋ ๊ฒ์ด ๊ฐ๋ฅํฉ๋๋ค. ์ํ์ ์์๋ ์ง์ ๋์ง๋ ์์์ง๋ง, ์ฝ๋ ์ ์ด ๋ณ๊ฒฝ๋๊ธฐ ์ ๊น์ง๋ ๋์ผํฉ๋๋ค.
๋ช ์์ ์ธ ์์๊ฐ ์๋ค๋ ๋จ์ ์ ์ผ๋ถ ํน์ฑ[redeeming traints]์ด ํจ๊ป ๋ฐ๋ผ๊ฐ๋๋ค.
๋ฐฐ์ด๊ณผ ๋ค๋ฅด๊ฒ ๋์ ๋๋ฆฌ๋ ์์๊ฐ ์์ด๋ ๊ฒ์ ๋ํด ๊ฑฑ์ ํ ํ์๊ฐ ์์ต๋๋ค. ๋์ ๋๋ฆฌ์ ์ฝ์ ํ๋ ๊ฒ์ ํญ์ ์ผ์ ํ ์์์๊ฐ์ด ๋ญ๋๋ค.
์กฐํ(Lookup)์์ ์๋ ๋๊ฐ์ด ์์์๊ฐ์ด ๊ฑธ๋ฆฝ๋๋ค.์ด๋ ๋ฐฐ์ด์์ ํน์ ์์๋ฅผ ์ฐพ์ ๋ ๋ฐฐ์ด์ ์ฒ์๋ถํฐ ์ฝ์ ์์น๊น์ง ๊ฐ์ผ๋๋ ๊ฒ๋ณด๋ค ํ์ ํ๊ฒ ๋น ๋ฆ ๋๋ค.
์ธํธ Set
์ธํธ๋ ๊ณ ์ ํ ๊ฐ์ ๊ฐ์ง ์ปจํ ์ด๋์ ๋๋ค. ์์ดํ ์ ๋ฃ์ ์ ์์ง๋ง ์ด๋ฏธ ๊ฐ์ง๊ณ ์๋ ์์ดํ ์ ๊ฑฐ๋ถํ๋ ๊ฐ๋ฐฉ์ ๋ ์ฌ๋ ค๋ณด์ธ์.
var bag: Set<String> = ["Candy", "Juice", "Gummy"]
bag.insert("Candy")
print(bag) // prints ["Candy", "Juice", "Gummy"]
์ธํธ๋ ๊ณ ์ ์ฑ์ ์ ์ฉํ๋ฏ๋ก, ์ฝ๋ ์ ์ ์ค๋ณต๊ฐ์ ์ฐพ๋ ๋ฑ, ๋ค์ํ ์ดํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉ๋ฉ๋๋ค.
let values: [String] = [...]
var bag: Set<String> = []
for value in values {
if bag.contains(value) {
// bag already has it, therefore it is a duplicate
}
bag.insert(value)
}
๋์ ๋๋ฆฌ๋ ๋ฐฐ์ด์ฒ๋ผ ์ธํธ๋ฅผ ์์ฃผ ์ฌ์ฉํ์ง๋ ์์ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ฌ๋ฌ๋ถ์ ๋๊ตฌํจ[toolbelt]์ ๋ณด๊ดํด์ผํ๋ ์ค์ํ ์๋ฃ๊ตฌ์กฐ๊ฐ ๋ ๋งํผ ์ผ๋ฐ์ ์ ๋๋ค. ๊ทธ๋ฌ๋ ํ ๊ฐ์ง ์ ์์ฌํญ์ด ์์ต๋๋ค. ๋์ ๋๋ฆฌ์ ์ ์ฌํ๊ฒ, ์ธํธ์ ๊ฐ๋ค์ ์์๋ผ๋ ๊ฐ๋ ์ด ์์ต๋๋ค.์ธํธ๋ฅผ ์ด์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋ชจ์ ๋ ์ด๋ฅผ ์ ๋ ํ์ธ์.
์ค์ํํธ ์ฝ๋ ์ ํจํค์ง The Swift Collections package
์ค์ํํธ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๊ฐ์ฅ ์ค์ํ 3๊ฐ์ ์๋ฃ๊ตฌ์กฐ์ธ ๋ฐฐ์ด Array, ์ธํธ Set, ๋์ ๋๋ฆฌ Dictionary ๋ง ๊ตฌํํฉ๋๋ค. ์ถ๊ฐ์ ์ธ ์๋ฃ๊ตฌ์กฐ๋ ์ค์ํํธ ์ฝ๋ ์ ํจํค์ง Swift Collections package ๋ฅผ ์ฐธ๊ณ ํ์ธใ ์. ์ด ํจํค์ง๋ ๊ณต์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋๊ธฐ ์ ์ ์๋ก์ด ์ฝ๋ ์ ํ์ ์ ์ปค๋ฎค๋ํฐ์์ ๊ฐ๋ฐ ๋ฐ ํ ์คํธ๋ฅผ ํ ์ ์์ต๋๋ค.
๋ค์ ์น์ ์์ ์ด ํจํค์ง์ ์๋ฃ๊ตฌ์กฐ์ค ํ๋๋ฅผ ๊น์ด ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๋ฐํฌ Deque
์์ ์ฐ๋ฆฌ๋ ๋ฐฐ์ด Array ์ ๋งจ ์์ ์์๋ฅผ ์ฝ์ ํ๋ ๊ฒ์ด ๋ชจ๋ ์์์ ์ด๋์ ์ผ๊ธฐํ๋ค๊ณ ๋ฐฐ์ ์ต๋๋ค.
์ธ๋ป ๋ณด๊ธฐ์ ๋ฐํฌDeque (”deck”๋ฑ์ผ๋ก ๋ฐ์๋ฉ๋๋ค) ์๋ฃ๊ตฌ์กฐ๋ ๋ฐฐ์ด Array ๊ณผ ๋์ผํ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค. ๋ฐํฌ๋ ๊ฐ์ ์์๋๋ก ๋ณด๊ดํ๋ ๋ฒ์ฉ ์ปจํ ์ด๋๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ฐฐ์ด Array ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก append ๋ฅผ ํธ์ถํ์ฌ ๋ฐํฌ Deque ์ ์์๋ฅผ ์ฝ์ ํ๊ฑฐ๋ remove(at:)์ ์ฌ์ฉํ์ฌ ์ผ๋ถ ์ธ๋ฑ์ค์ ํน์ ์์๋ฅผ ์ ๊ฑฐํ ์ ์์ต๋๋ค.
์ค์ ๋ก ๋ฐฐ์ด Array ๊ณผ ๋ฐํฌ Deque ๋ ๋ค ๋์ผํ ์ฝ๋ ์ ํ๋กํ ์ฝ์ ๊ตฌํํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ธํฐํ์ด์ค๋ ๊ฑฐ์ ๋์ผํฉ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ ๋ฐฐ์ด Array ๋ณด๋ค ๋ฐํฌ Deque ๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ ๋ฌด์์ผ๊น์? ์๊ฐ๋ณต์ก์ฑ์ ๊ณ ๋ คํ๊ธฐ ์ ๊น์ง ํธ๋ ์ด๋์คํ tradeoff ๋ฅผ ํ์ธํ๊ธด ์ด๋ ต์ต๋๋ค.
๋ฐํฌ Deque ๋ ์๋ฐฉํฅ[double-ended] ํqueue ์ ๋๋ค. ๊ทธ๋ ๊ธฐ๋๋ฌธ์ ๋ฐํฌ Deque ๋ ์ฝ๋ ์ ์ ์๊ณผ ๋ค์์ ์์ ์ด ์ต์ ํ ๋์ด์์ต๋๋ค. ๋ฐฐ์ด Array ๊ณผ ๋ค๋ฅด๊ฒ ๋ฐํฌ์ Deque ์์์ ์์๋ฅผ ์ฝ์ ํ๊ฑฐ๋ ์ญ์ ํ๋ ๊ฒ์ ์ ๋ ดํ O(1) ๋ก ์ํ๋ฉ๋๋ค.
์ข๋ค์. ๊ทธ๋ ๋ค๋ฉด ๋จ์ ์ ๋ฌด์์ผ๊น์? ํ๋ก๊ทธ๋๋ฐ ์์ ๋ชจ๋ ๊ฒ๋ค์ ๋ชจ๋ ํธ๋ ์ด๋์คํ tradeoff ์ ๊ดํ ๊ฒ์ ๋๋ค. ๋ฐํฌ Deque ์ ๊ฒฝ์ฐ, ๋ฐํฌ์ ์๋ถ๋ถ์์ ์์ ์ด ์ฉ์ดํด์ง ๋์ , ๋๋จธ์ง ๋ชจ๋ ๊ฒ๋ค์ ์ฑ๋ฅ์ ์กฐ๊ธ์ฉ ์ ํ์ํต๋๋ค. ํ๋ก๊ทธ๋๋จธ๋ก์ ์ต์ ์ ํ๊ฐํ๊ณ ์์ ์ ๊ฐ์ฅ ์ ํฉํ ๋๊ตฌ๋ฅผ ๊ณ ๋ฅด๋ ๊ฒ์ด ์ฌ๋ฌ๋ถ์ ์ผ์ ๋๋ค. ๋ง์ฝ ์ฌ๋ฌ๋ถ์ด ์ฝ๋ ์ ์ ์๋ถ๋ถ์์ ์์ฃผ ์์ ์ด ํ์ํ๋ค๋ฉด ๋ฐํฌ Deque ๊ฐ ๋ฐฐ์ด Array ๋ณด๋ค ํจ์ฌ ์ฑ๋ฅ์ด ์ข์ ๊ฒ์ ๋๋ค. ์ด๋ ๋ ๋์ ์ฌ์ฉ์ ๊ฒฝํ์ผ๋ก ์นํ๋ ์ ์์ต๋๋ค. ์ด๊ฒ์ด ๋ฐ๋ก ๋น ๋ฅธ์ฑ๊ณผ ๋๋ฆฐ ์ฑ์ ์ฐจ์ด๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
์ค์ํํธ ์ฝ๋ ์ ํจํค์ง๋ OrderedDictionary , OrderedSet ์ ๊ฐ์ ๋ถ๊ฐ์ ์ธ ์๋ฃ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ ๋์ด์์ ๋ณด์ด๋ ๋ฐ์ ๊ฐ์ด ์ด๋ค์ ์์์ ์์๋ฅผ ์ ์งํ๋ ๋์ ๋๋ฆฌ Dictionary ์ ์ธํธ Set ์ ๋ณํ์ ๋๋ค. ๋ฐํฌ Deque ์ ๊ฐ์ด ์ด๋ฐ ์๋ฃ๊ตฌ์กฐ๋ค์ ์ฑ๋ฅ์์ ํธ๋ ์ด๋์คํ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ด์ ๋ํด์๋ https://swift.org/blog/swift-collections/ ์ด ๋งํฌ์์ ๋ ์์๋ณผ ์ ์์ต๋๋ค.
ํต์ฌ ์์ฝ Key points
- ๋ชจ๋ ์๋ฃ๊ตฌ์กฐ๋ ๊ฐ๊ธฐ ์ฅ์ ๊ณผ ๋จ์ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ด๋ฅผ ์๋ ๊ฒ์ ์ข์ ์ฑ๋ฅ์ ์ํํธ์จ์ด๋ฅผ ์์ฑํ๋๋ฐ ํต์ฌ์ด ๋ฉ๋๋ค.
- ๋ฐฐ์ด Array ์์ insert(at:) ๊ณผ ๊ฐ์ ๋ฉ์๋๋ฅผ ๊ณํ์์ด ์ฌ์ฉํ๋ฉด ์ฑ๋ฅ์ด ์ ํ๋ ์ ์๋ ์ฑ๋ฅํน์ฑ์ด ์์ต๋๋ค. ๋ฐฐ์ด์ ์๋ถ๋ถ๊ณผ ๊ฐ๊น์ด ์ธ๋ฑ์ค์ insert(at:) ๋ฉ์๋๋ฅผ ์์ฃผ ์ฌ์ฉํด์ผํ๋ค๋ฉด ์ฐ๊ฒฐ๋ฆฌ์คํธ linked list ์ ๊ฐ์ ์๋ฃ๊ตฌ์กฐ๋ฅผ ๊ณ ๋ คํด๋ณผ ์ ์์ต๋๋ค.
- ๋์ ๋๋ฆฌ Dictionary ๋ ์์๋ฅผ ๊ฐ์ง๋ ๋์ ๋น ๋ฅธ ์ฝ์ ๊ณผ ๊ฒ์์ ํ ์ ์์ต๋๋ค.
- ์ธํธ Set ๋ ๊ฐ์ ์ฝ๋ ์ ์์ ๊ณ ์ ์ฑ์ ๋ณด์ฅํฉ๋๋ค. ์ธํธ Set ๋ ์๋์ ์ต์ ํ๋์ด์์ผ๋ฉฐ ์์์ ์์๋ฅผ ์ ์งํ๋ ๊ธฐ๋ฅ์ ํฌ๊ธฐํ์์ต๋๋ค.
- ์ค์ํํธ ์ฝ๋ ์ ํจํค์ง๋ ํน์ ์๋๋ฆฌ์ค์์ ๋ ์ ์ํํ๋ ํน๋ณํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ํฌํจํฉ๋๋ค.
๐ ๋ฒ์ญ ์๋ฆฌ์ฆ ๋งํฌ
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
๋ง์น๋ฉฐ
์ค๋๋ ์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
๊ถ๊ธํ ์ ์ด ์๋ค๋ฉด ๋๊ธ๋ก, ๋์์ด ๋์ จ๋ค๋ฉด ๊ณต๊ฐ ๋ถํ๋๋ฆฝ๋๋ค.
ํน์ ์์ ํ๊ฑฐ๋ ํผ๋๋ฐฑํ์ค ๋ด์ฉ ์๋ค๋ฉด ์ธ์ ๋ ๋๊ธ๋ก ๋ถํ๋๋ฆฝ๋๋ค.
๊ฐ์ฌํฉ๋๋ค.
๋๊ธ