<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๋ฅผ ์ถ๊ฐ์ ์ผ๋ก ์ ์ฅํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ ํ๋๋น ์ฐจ์งํ๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ ์ปค์ง๊ฒ ๋๋ค.

> ๋ฌผ๋ฆฌ์ ๋ถ์ฐ์์ฑ

> ๋
ผ๋ฆฌ์ ์ฐ์์ฑ
### ์๊ฐ๋ณต์ก๋
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ํ๋ ๋ฐฉ์
- ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ ๋์ ์๊ฐ๋ณต์ก๋

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)$์ด๋ค.