<h1><center> Array </center></h1> ###### tags: `๐Ÿ’ป TIL`, `Computer Science`, `DataStructure` ###### date: `2024-02-06T15:12:33.284Z` > [color=#724cd1][name=๋ฐ๋ฆญ] > [Nossi.DEV - Array](https://www.nossi.dev/ba77bf13-fdd7-4d3c-a88e-9b54f749434c) > [Nossi.DEV - Linked List](https://www.nossi.dev/e2a9c68a-98d4-477a-8369-fb6dc367df2b) ## Array > Array๋Š” ์—ฐ๊ด€๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์ƒ์— ์ˆœ์ฐจ์ ์œผ๋กœ ๋ฏธ๋ฆฌ ํ• ๋‹น๋œ ํฌ๊ธฐ๋งŒํผ ์ €์žฅํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. **ํŠน์ง•** - ๊ณ ์ •๋œ ์ €์žฅ๊ณต๊ฐ„ (Fixed-Size) - ์ˆœ์ฐจ์ ์œผ๋กœ ์ €์žฅ๋˜๋Š” ๋ฐ์ดํ„ฐ **์žฅ์ ** Array์˜ append๊ฐ€ ๋น ๋ฅด๋‹ค๋Š” ์ ์ด๋‹ค. ๋”ฐ๋ผ์„œ, ์กฐํšŒ๋ฅผ ์ž์ฃผ ํ•ด์•ผ๋˜๋Š” ์ž‘์—…์—์„œ Array ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๋งŽ์ด ์“ด๋‹ค๊ณ  ํ•œ๋‹ค. **๋‹จ์ ** Fixed-Size ํŠน์„ฑ์ƒ ์„ ์–ธ์‹œ์— ํฌ๊ธฐ๋ฅผ ๋ฏธ๋ฆฌ ์ •ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์ด๋‹ค. ์ด๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๋‚˜ ์ถ”๊ฐ€์ ์ธ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. **Function ์‹œ๊ฐ„๋ณต์žก๋„** - append : $O(1)$ - append : $O(1)$ - contains(where:) : $O(N)$ - insert(_:at:) : $O(N)$ - remove(at:) : $O(N)$ - removeFirst() : $O(N)$ - removeLast() : $O(1)$ ### ๋ฏธ๋ฆฌ ์˜ˆ์ƒํ•œ ๊ฒƒ๋ณด๋‹ค ๋” ๋งŽ์€ ์ˆ˜์˜ Data๋ฅผ ์ €์žฅํ•˜๋А๋ผ Array์˜ Size๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ๊ฒฝ์šฐ, ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•ด์•ผ ํ•˜๋‚˜? 1. ๋™์  ๋ฐฐ์—ด(Dynamic Array) ์‚ฌ์šฉ - ์ •์ ์ธ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง„ ๋ฐฐ์—ด ๋Œ€์‹  ๋™์  ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•œ๋‹ค. ํ•˜์ง€๋งŒ, Swift์—์„œ๋Š” Array๊ฐ€ ๋™์  ๋ฐฐ์—ด๋กœ ์ž๋™์œผ๋กœ ๊ด€๋ฆฌ๋˜๋ฏ€๋กœ, ์ผ๋ฐ˜์ ์œผ๋กœ ์ด ๋ฌธ์ œ๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค. 2. Linked List ์‚ฌ์šฉ - ๋ฐฐ์—ด ๋Œ€์‹  Linked List๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ๋™์ ์œผ๋กœ ํฌ๊ธฐ๊ฐ€ ์กฐ์ ˆ๋˜๋ฏ€๋กœ, ๋ฐ์ดํ„ฐ ์–‘์— ๋”ฐ๋ผ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋™์ ์œผ๋กœ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค. 3. Collection Data Structure ์‚ฌ์šฉ - Swift์—์„œ๋Š” ๋ฐฐ์—ด ์ด์™ธ์—๋„ Set, Dictionary์™€ ๊ฐ™์€ ์ปฌ๋ ‰์…˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. 4. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์šฉ - ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋ ค๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋‹ค. Core Dat์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ์˜๊ตฌ์ ์œผ๋กœ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ## Linked List > Node๋ผ๋Š” ๊ตฌ์กฐ์ฒด๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋Š”๋ฐ, Node๋Š” ๋ฐ์ดํ„ฐ ๊ฐ’๊ณผ ๋‹ค์Œ Node์˜ address๋ฅผ ์ €์žฅํ•œ๋‹ค. Linked List๋Š” ๋ฌผ๋ฆฌ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ์ƒ์—์„œ๋Š” ๋น„์—ฐ์†์ ์œผ๋กœ ์ €์žฅ๋˜์ง€๋งŒ Linked List๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฐ Node๋“ค์ด Next Node์˜ address๋ฅผ ๊ฐ€๋ฆฌํ‚ด์œผ๋กœ์จ ๋…ผ๋ฆฌ์ ์ธ ์—ฐ์†์„ฑ์„ ๊ฐ€์ง„ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. - Tree, Graph ๋“ฑ์˜ ๋‹ค๋ฅธ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ์ž์ฃผ ์“ฐ์ด๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. - ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์—์„œ๋Š” ๋ถˆ์—ฐ์†์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๋Š” ์ ๊ณผ Node์˜ Next Address๋ฅผ ํ†ตํ•ด ๋ถˆ์—ฐ์†์ ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฐ๊ฒฐํ•˜์—ฌ ๋…ผ๋ฆฌ์  ์—ฐ์†์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค๋Š” ์  - ๋ฐ์ดํ„ฐ๊ฐ€ ์ถ”๊ฐ€๋˜๋Š” ์‹œ์ ์—์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ข€ ๋” ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค ### ๋…ผ๋ฆฌ์  ์—ฐ์†์„ฑ ๊ฐ Node๋“ค์€ Next Address์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋…ผ๋ฆฌ์ ์œผ๋กœ ์—ฐ์†์„ฑ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค. Array์˜ ๊ฒฝ์šฐ ์—ฐ์†์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ฌผ๋ฆฌ์  ๋ฉ”๋ชจ๋ฆฌ ์ƒ์—์„œ ์ˆœ์ฐจ์ ์œผ๋กœ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ, Linked List๋Š” ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์—ฐ์†์„ฑ์„ ์œ ์ง€ํ•˜์ง€ ์•Š์•„๋„ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ## ๋‹ค์ด๋ฆฌ ์‚ฌ์šฉ์ด ์ข€ ๋” ์ž์œ ๋กœ์šด ๋Œ€์‹ , Next Address๋ฅผ ์ถ”๊ฐ€์ ์œผ๋กœ ์ €์žฅํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ ํ•˜๋‚˜๋‹น ์ฐจ์ง€ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋” ์ปค์ง€๊ฒŒ ๋œ๋‹ค. ![แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2024-02-06 15.15.26](https://hackmd.io/_uploads/SygcKRrJip.png) > ๋ฌผ๋ฆฌ์  ๋ถˆ์—ฐ์†์„ฑ ![image](https://hackmd.io/_uploads/ByBuCS1o6.png) > ๋…ผ๋ฆฌ์  ์—ฐ์†์„ฑ ### ์‹œ๊ฐ„๋ณต์žก๋„ Array์˜ ๊ฒฝ์šฐ ์ค‘๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž… / ์‚ญ์ œํ•˜๊ฒŒ ๋˜๋ฉด ํ•ด๋‹น ์ธ๋ฑ์Šค์˜ ๋’ค์— ์žˆ๋Š” ๋ชจ๋“  ์›์†Œ๋“ค์ด ์ด๋™ํ•ด์•ผ ํ–ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ค ๋ณด๋‹ˆ $O(n)$์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ–๊ฒŒ ๋˜์—ˆ๋‹ค. ํ•˜์ง€๋งŒ, Linked List๋ฅผ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ์˜ฎ๊ธธ ํ•„์š”์—†์ด Next Address๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Œ๊ฐ’๋งŒ ๋ณ€๊ฒฝํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— $O(1)$์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋กœ ์‚ฝ์ž… / ์‚ญ์ œ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ### Array vs Linked List **Array** - ๋ฉ”๋ชจ๋ฆฌ์ƒ์—์„œ ์—ฐ์†์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ - ๋ฐ์ดํ„ฐ ์กฐํšŒ $O(1)$ - ์‚ฝ์ž… / ์‚ญ์ œ $O(n)$ - ์–ผ๋งˆ๋งŒํผ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ• ์ง€ ๋ฏธ๋ฆฌ ์•Œ๊ณ  ์žˆ๊ณ , ์กฐํšŒ๋ฅผ ๋งŽ์ด ํ•œ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹๋‹ค. **Linked List** - ๋ฉ”๋ชจ๋ฆฌ์ƒ์—์„œ๋Š” ์—ฐ์†์ ์ด์ง€ ์•Š์ง€๋งŒ, ๊ฐ๊ฐ์˜ ์›์†Œ๊ฐ€ ๋‹ค์Œ ์›์†Œ์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ’์„ ์ €์žฅํ•ด ๋†“์Œ์œผ๋กœ์จ ์—ฐ์†์„ฑ์„ ์œ ์ง€ - ๋ฐ์ดํ„ฐ ์กฐํšŒ $O(n)$ - ์‚ฝ์ž… / ์‚ญ์ œ $O(1)$ - ๋ช‡๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ง€ ๋ถˆํ™•์‹คํ•˜๊ณ  ์‚ฝ์ž…, ์‚ญ์ œ๊ฐ€ ๋งŽ์ด ๋œ๋‹ค๋ฉด ์‚ฌ์šฉ **Memory Allocation** Array์˜ ์ฃผ๋œ ์žฅ์ ์€ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ๊ณผ append๊ฐ€ ๋น ๋ฅด๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ, ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๋ผ๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. ๋ฐฐ์—ด์€ ์„ ์–ธ์‹œ์— fixed size๋ฅผ ์„ค์ •ํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•œ๋‹ค. ์ฆ‰, ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ์ง€ ์•Š๋”๋ผ๋„ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฐจ์ง€ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ๋ฐ˜๋ฉด, Linked List๋Š” Runtime ์ค‘์— Size๋ฅผ ๋Š˜๋ฆฌ๊ณ  ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ initial size๋ฅผ ๊ณ ๋ฏผํ•  ํ•„์š”๊ฐ€ ์—†๊ณ  ํ•„์š”ํ•œ ๋งŒํผ ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹นํ•˜์—ฌ ๋‚ญ๋น„๊ฐ€ ์—†๋‹ค. ## Dynamic Array Array์˜ ๊ฒฝ์šฐ size๊ฐ€ ๊ณ ์ •๋œ๋‹ค๊ณ  ํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์„ ์–ธ์‹œ์— ์„ค์ •ํ•œ size๋ณด๋‹ค ๋งŽ์€ ๊ฐœ์ˆ˜์˜ Data๊ฐ€ ์ถ”๊ฐ€๋˜๋ฉด ์ €์žฅํ•  ์ˆ˜ ์—†๋‹ค. ์ด์— ๋ฐ˜ํ•ด, Dynamic Array๋Š” ์ €์žฅ๊ณต๊ฐ„์ด ๊ฐ€๋“ ์ฐจ๊ฒŒ ๋˜๋ฉด resize๋ฅผ ํ•˜์—ฌ ์œ ๋™์ ์œผ๋กœ size๋ฅผ ์กฐ์ ˆํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. - ๊ธฐ์กด Array์˜ ํŠน์ง• ์ค‘ Fixed-size์˜ ํ•œ๊ณ„์ ์„ ๋ณด์™„ํ•˜๊ณ ์ž ๊ณ ์•ˆ๋œ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. - resizeํ•˜๋Š” ๋ฐฉ์‹ - ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ์˜ ์‹œ๊ฐ„๋ณต์žก๋„ ![image](https://hackmd.io/_uploads/HyR5k8kop.png) Dynamic Array๋Š” size๋ฅผ ์ž๋™์ ์œผ๋กœ Resizingํ•˜๋Š” ๋ฐฐ์—ด์ด๋‹ค. ๊ธฐ์กด์— ๊ณ ์ •๋œ size๋ฅผ ๊ฐ€์ง„ Static Array์˜ ํ•œ๊ณ„์ ์„ ๋ณด์™„ํ•˜๊ณ ์ž ๊ณ ์•ˆ๋˜์—ˆ๋‹ค. Dynamic Array๋Š” Data๋ฅผ ๊ณ„์† ์ถ”๊ฐ€ํ•˜๋‹ค๊ฐ€ ๊ธฐ์กด์— ํ• ๋‹น๋œ Memory๋ฅผ ์ดˆ๊ณผํ•˜๊ฒŒ ๋˜๋ฉด, size๋ฅผ ๋Š˜๋ฆฐ ๋ฐฐ์—ด์„ ์„ ์–ธํ•˜๊ณ  ๊ทธ๊ณณ์— ๋ฐ์ดํ„ฐ๋ฅผ ์˜ฎ๊น€์œผ๋กœ์จ ๋Š˜์–ด๋‚œ ํฌ๊ธฐ์˜ ์‚ฌ์ด์ฆˆ๋ฅผ ๊ฐ€์ง„ ๋ฐฐ์—ด์ด๋œ๋‹ค. ์ด๋ฅผ resize๋ผ๊ณ  ํ•œ๋‹ค. Resizing์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ๋Š”๋ฐ, ๋Œ€ํ‘œ์ ์œผ๋กœ ๊ธฐ์กด Array Size์˜ 2๋ฐฐ ์‚ฌ์ด์ฆˆ๋ฅผ ํ• ๋‹นํ•˜๋Š” Doubling์ด ์žˆ๋‹ค. **Doubling** resize์˜ ๋Œ€ํ‘œ์ ์ธ ๋ฐฉ๋ฒ•์ด๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋‹ค๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ดˆ๊ณผํ•˜๊ฒŒ ๋˜๋ฉด ๊ธฐ์กด ๋ฐฐ์—ด size๋ณด๋‹ค ๋‘ ๋ฐฐ ํฐ ๋ฐฐ์—ด์„ ์„ ์–ธํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์ผ์ผ์ด ์˜ฎ๊ธฐ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. **๋ถ„ํ• ์ƒํ™˜ ์‹œ๊ฐ„๋ณต์žก๋„(Amortize time complexity)** Dynamic Array์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค, $O(1)$์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค. -> ์ถ”๊ฐ€๋ฅผ ํ•˜๋‹ค๊ฐ€ ๋ฏธ๋ฆฌ ์„ ์–ธ๋œ ์‚ฌ์ด์ฆˆ๋ฅผ ๋„˜๊ธฐ๋Š” ์ˆœ๊ฐ„์— Resize๋ฅผ ํ•˜๊ฒŒ ๋œ๋‹ค. -> ์ด ๋•Œ๋Š” ์ผ์ผ์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ์˜ฎ๊ฒจ์•ผ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋•Œ๋งŒํผ์€ $O(n)$์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค. **๊ทธ๋ ‡๋‹ค๋ฉด ๊ฒฐ๊ณผ์ ์œผ๋กœ append์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” $O(1)$์ผ๊นŒ $O(n)$์ผ๊นŒ์š”?** append์˜ ์ด ๊ณผ์ •์„ ์‚ดํŽด๋ณด๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค์— ์ถ”๊ณผํ•˜๋Š” ($O(1)$)์ž‘์—…์ด ๋Œ€๋‹ค์ˆ˜์ด๊ณ , size๋ฅผ ๋„˜์–ด์„ค ๋•Œ๋Š” size๋ฅผ ๋‘ ๋ฐฐ ๋Š˜๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์ผ์ผ์ด ์˜ฎ๊ธฐ๋Š” ๊ณผ์ •(resize - $O(n)$)์ด ์•„์ฃผ ๊ธฐ๋” ๋ฐœ์ƒํ•œ๋‹ค. ๊ฒฐ๋ก ์€ append์˜ ์ „์ฒด์ ์ธ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” $O(1)$์ด๋‹ค.