๐น 2. Data Structures
01. ๋ฐฐ์ด๊ณผ ๋ฌธ์์ด
[ ํด์ํ ์ด๋ธ ]
: ํค(key)๋ฅผ ๊ฐ(value)์ ๋์์์ผ ํจ์จ์ ์ธ ํ์์ด ๊ฐ๋ฅํ ์๋ฃ๊ตฌ์กฐ
๊ตฌํ ๋ฐฉ์
์ฐ๊ฒฐ๋ฆฌ์คํธ(linked list)์ ํด์ ์ฝ๋ ํจ์(hash code function)์ ์ฌ์ฉ
- key์ ํด์์ฝ๋๋ฅผ ๊ณ์ฐํ๋ค.
hash(key) % array_length
์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ํด์ ์ฝ๋๋ฅผ ์ด์ฉํด ๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ฅผ ๊ตฌํ๋ค. (์๋ก ๋ค๋ฅธ ๋ ๊ฐ์ ํด์ ์ฝ๋๊ฐ ๊ฐ์ ์ธ๋ฑ์ค๋ฅผ ๊ฐ๋ฆฌํฌ ์ ์๋ค.)๋ฐฐ์ด์ ๊ฐ ์ธ๋ฑ์ค์ ํค์ ๊ฐ์ผ๋ก ์ด๋ฃจ์ด์ง ์ฐ๊ฒฐ๋ฆฌ์คํธ๊ฐ ์กด์ฌํ๋ค. ํค์ ๊ฐ์ ํด๋น ์ธ๋ฑ์ค์ ์ ์ฅํ๋ค.
์ถฉ๋(์๋ก ๋ค๋ฅธ ๋ ๊ฐ์ ํด์ ์ฝ๋๊ฐ ๊ฐ์ ์ธ๋ฑ์ค๋ฅผ ๊ฐ๋ฆฌํด)์ ๋๋นํ์ฌ ๋ฐ๋์ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ ์ด์ฉํ๋ค.
์ํ ์๊ฐ
- ์ต์ ์ ๊ฒฝ์ฐ : ๋ชจ๋ ํด์๊ฐ์ด ์ถฉ๋์ ์ผ์ผํค๋ ๊ฒฝ์ฐ ํ์ ์๊ฐ O(N)
- ์ต์ ์ ๊ฒฝ์ฐ : ์ถฉ๋์ด ํ๋๋ ์ผ์ด๋์ง ์์ ํ์ ์๊ฐ O(1)
๋ค๋ฅธ ๊ตฌํ๋ฐฉ๋ฒ
์ด์ง ํ์ ํธ๋ฆฌ(balanced binarysearch tree)๋ฅผ ์ฌ์ฉ
- ํ์ ์๊ฐ : O(logN)
- ์ฅ์
- ํฌ๊ธฐ๊ฐ ํฐ ๋ฐฐ์ด์ ๋ฏธ๋ฆฌ ํ ๋นํด ๋์ง ์์๋ ๋๊ธฐ ๋๋ฌธ์ ์ ์ฌ์ ์ผ๋ก ์ ์ ๊ณต๊ฐ ์ฌ์ฉ
- ํค์ ์งํฉ์ ํน์ ์์๋ก ์ฐจ๋ก๋๋ก ์ ๊ทผ ๊ฐ๋ฅ
[ ArrayList์ ๊ฐ๋ณ ํฌ๊ธฐ ๋ฐฐ์ด ]
ArrayList๋ ์ผ๋ฐ ๋ฐฐ์ด๊ณผ ๋ค๋ฅด๊ฒ ๋์ ๊ฐ๋ณ ํฌ๊ธฐ ๊ธฐ๋ฅ์ด ์๋ค.
- ์ ๊ทผ ์๊ฐ : O(1), ๋ฐฐ์ด์ด ๊ฐ๋ ์ฐจ๋ ์๊ฐ ํฌ๊ธฐ๋ฅผ ๋ ๋ฐฐ๋ก ๋๋ฆฌ๋ ์๊ฐ์ O(n)์ด์ง๋ง ๋๋ฌธ ์ผ์ด๋ค.
์ํ ์ ๋ ฅ ์๊ฐ์ ์ O(1)์ด ๋๋๊ฐ?
ํฌ๊ธฐ๊ฐ N์ธ ๋ฐฐ์ด์ด ์์ ๋, ๋ฐฐ์ด์ ํฌ๊ธฐ๋ฅผ ๋๋ฆด ๋ ํ์ํ ์์์ ๊ฐ์๋ฅผ ์ญ์ผ๋ก ๊ณ์ฐํด๋ณธ๋ค.
โ N๊ฐ์ ์์๋ฅผ ์ฝ์
ํ๊ธฐ ์ํด์ ํด์ผํ๋ ์์์ ์ด ๊ฐ์๋ N/2 + N/4 + N/8 + โฆ + 2 + 1
๋ก N๋ณด๋ค ์๋ค
๋ฐฐ์ด์ ์ํฉ์ ๋ฐ๋ผ ์ต์ ์ ๊ฒฝ์ฐ O(N)์ด ์์๋๋ ์ฝ์ ์ฐ์ฐ๋ ์กด์ฌํ์ง๋ง, ํ๊ท ์ ์ผ๋ก ๊ฐ ์ฝ์ ์ O(1)์ด๋ค.
[ StringBuilder ]
for๋ฌธ์ ์ฌ์ฉํ ๋ฌธ์์ด ๋ถ์ด๊ธฐ
๋ฌธ์์ด์ ๋ฆฌ์คํธ๊ฐ ์ฃผ์ด์ก์ ๋ ํ๋์ ๋ฌธ์์ด๋ก ์ด์ด๋ถ์ด๋ ค ํ๋ค. ์ด๋์ ์ํ์๊ฐ์?
๋ชจ๋ ๋ฌธ์์ด์ ๊ธธ์ด๋ฅผ x๋ผ๊ณ ํ์ ๋, ์ด์ด๋ถ์ผ ๋๋ง๋ค ๋ ๊ฐ์ ๋ฌธ์์ด์ ์ฝ๊ณ ํ๋ํ๋ ์๋ก์ด ๋ฌธ์์ด์ ๋ณต์ฌํด์ผํ๋ค. ์ฒ์์๋ x๊ฐ, ๋ ๋ฒ์งธ๋ 2x๊ฐ, ์ธ ๋ฒ์งธ๋ 3x๊ฐ, n๋ฒ์งธ๋ nx๊ฐ์ ๋ฌธ์๋ฅผ ๋ณต์ฌํด์ผ ํ๋ค.
๋ฐ๋ผ์ ์ด ์ํ์๊ฐ์ O(x + 2x + โฆ + nx), ์ฆ O(xn^2)์ด ๋๋ค.
\[1+2+...+n = n(n+1) \rightarrow O(n^2)\]StringBuilder๋ฅผ ์ด์ฉํ ๋ฌธ์์ด ๋ถ์ด๊ธฐ
StringBuilder๋ ๊ฐ๋ณ ํฌ๊ธฐ ๋ฐฐ์ด์ ์ด์ฉํ์ฌ ํ์ํ ๊ฒฝ์ฐ์๋ง ๋ฌธ์์ด์ ๋ณต์ฌํ๊ฒ ํด์ค๋ค.
02. ์ฐ๊ฒฐ๋ฆฌ์คํธ
: ์ฐจ๋ก๋ก ์ฐ๊ฒฐ๋ ๋ ธ๋๋ฅผ ํํํด์ฃผ๋ ์๋ฃ๊ตฌ์กฐ(๋จ๋ฐฉํฅ, ์๋ฐฉํฅ)
- ํ์: O(N)
- ์ฝ์ , ์ญ์ : O(1) (ํน์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ ์ฉ)
[ ์ฐ๊ฒฐ๋ฆฌ์คํธ ๋ง๋ค๊ธฐ ]
์ ์ฝ๋์์ LinkedList๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์ฐ๊ฒฐ๋ฆฌ์คํธ์ ์ ๊ทผํ ๋ head ๋ ธ๋์ ์ฃผ์๋ฅผ ์ฐธ์กฐํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค.
โ ์ฌ๋ฌ ๊ฐ์ฒด๋ค์ด ๋์์ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ ์ฐธ์กฐํ๋ ๋์ค์ head๊ฐ ๋ฐ๋๋ฉด ์ด๋ค ๊ฐ์ฒด๋ค์ ์ด์ head๋ฅผ ๊ณ์ ๊ฐ๋ฆฌํค๊ณ ์์ ์๋ ์๋ค.
์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Node ํด๋์ค๋ฅผ ํฌํจํ๋ LinkedList ํด๋์ค๋ฅผ ๋ง๋๋ ๊ฒ์ด ์ข๋ค. ๊ทธ๋ ๊ฒ ํ๋ฉด head Node ๋ณ์๋ฅผ ๋จ ํ๋๋ง ์ ์ํด ๋์์ผ๋ก์จ ์์ ๋ฌธ์ ์ ์ ์์ ํ ํด๊ฒฐํ ์ ์๋ค.
[ ๋จ๋ฐฉํฅ ์ฐ๊ฒฐ๋ฆฌ์คํธ์์ ๋ ธ๋ ์ญ์ ]
๋
ธ๋ n์ ์ญ์ ํ๊ณ ์ ํ ๋ ์ด์ ๋
ธ๋ prev๋ฅผ ์ฐพ์ prev.next
๋ฅผ n.next
์ ๊ฐ๋๋ก ์ค์ ํ๋ค.
์๋ฐฉํฅ์ธ ๊ฒฝ์ฐ์๋ n.next๊ฐ ๊ฐ๋ฆฌํค๋ ๋
ธ๋๋ฅผ ๊ฐฑ์ ํ์ฌ n.next.prev
๊ฐ n.prev
์ ๊ฐ๋๋ก ์ค์ ํ๋ค.
- ์ฃผ์ํ ์
- null ํฌ์ธํฐ ๊ฒ์ฌ๋ฅผ ๋ฐ๋์ ํด์ผํ๋ค.
- ํ์ํ ๊ฒฝ์ฐ head์ tail ํฌ์ธํฐ๋ ๊ฐฑ์ ํด์ผ ํ๋ค.
- (๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๊ฐ ํ์ํ ์ธ์ด์ผ ๊ฒฝ์ฐ ex. C, C++) ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ ๋๋ก ๋ฐํ๋์๋์ง ํ์ธํด์ผํ๋ค.
[ Runner ๊ธฐ๋ฒ ]
: ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ ์ํํ ๋ ๋ ๊ฐ์ ํฌ์ธํฐ๋ฅผ ๋์์ ์ฌ์ฉํ๋ ๊ฒ (Runner(๋ถ๊ฐ ํฌ์ธํฐ๋ผ๊ณ ๋ ํจ)์ ์ฐ๊ฒฐ๋ฆฌ์คํธ ๋ฌธ์ ์์ ๋ง์ด ํ์ฉ๋๋ ๊ธฐ๋ฒ)
์ด๋ ํ ํฌ์ธํฐ๊ฐ ๋ค๋ฅธ ํฌ์ธํฐ๋ณด๋ค ์์๋๋ก ํ๋ค.
์์
์ฐ๊ฒฐ๋ฆฌ์คํธ $a_1 \rightarrow a_2 \rightarrow \cdots \rightarrow a_n \rightarrow b_1 \rightarrow b_2 \rightarrow \cdots \rightarrow b_n$ ์ด ์์ ๋ ์ด ๋ฆฌ์คํธ๋ฅผ $a_1 \rightarrow b_1 \rightarrow a_2 \rightarrow b_2 \rightarrow \cdots \rightarrow a_n \rightarrow b_n$์ผ๋ก ์ฌ์ ๋ ฌํ๊ณ ์ถ๋ค. ์ ํํ ๊ธธ์ด๋ ๋ชจ๋ฅด์ง๋ง, ๊ธธ์ด๊ฐ ์ง์๋ผ๋ ์ ๋ณด๋ ์๊ณ ์๋ค.
์ด๋ ํฌ์ธํฐ p1(์์ ํฌ์ธํฐ)๋ฅผ ๋๊ณ , ๋ฐ๋ผ์ค๋ ํฌ์ธํฐ p2๊ฐ ํ ๋ฒ ์์ง์ผ ๋๋ง๋ค ํฌ์ธํฐ p1์ด ๋ ๋ฒ ์์ง์ด๋๋ก ์ค์ ํด ๋ณธ๋ค.
๊ทธ๋ฌ์ ๋ p1์ด ์ฐ๊ฒฐ๋ฆฌ์คํธ ๋์ ๋๋ฌํ๋ฉด p2๋ ๊ฐ์ด๋ฐ ์ง์ ์ ์๊ฒ ๋๋ค. ์ด ์ํ์์ p1์ ๋ค์ ๋งจ ์์ผ๋ก ์ฎ๊ธด ๋ค์ p2๋ก ํ์ฌ๊ธ ์์๋ฅผ ์ฌ๋ฐฐ์ดํ๋๋ก ๋ง๋ค ์ ์๋ค.
์ฆ, ๋ฃจํ๊ฐ ์คํ๋ ๋๋ง๋ค p2๊ฐ ๊ฐ๋ฆฌํค๋ ์์๋ฅผ p1 ๋ค๋ก ์ฎ๊ธฐ๋ ๊ฒ์ด๋ค.
[ ์ฌ๊ท ๋ฌธ์ ]
์ฐ๊ฒฐ๋ฆฌ์คํธ ๋ฌธ์ ๋ฅผ ํธ๋๋ฐ ์๋น์๋ ์ฌ๊ท ํธ์ถ์ ์์กดํจ
์ฌ๊ท ํธ์ถ์ ๊น์ด๊ฐ n์ด ๋ ๊ฒฝ์ฐ, ํด๋น ์ฌ๊ท ์๊ณ ๋ฆฌ์ฆ์ด ์ ์ด๋ O(n) ๋งํผ์ ๊ณต๊ฐ์ ์ฌ์ฉํ๋ค.
์ฌ๊ท ์๊ณ ๋ฆฌ์ฆ์ ๋ฐ๋ณต(iterative) ํํ๋ก ๊ตฌํ๋๋ฆฌ ์ ์๊ธด ํ์ง๋ง ๋ฐ๋ณต์ ํํ๋ก ๊ตฌํํ๋ฉด ํ์ธต ๋ณต์กํด์ง ์ ์๋ค.
03. ์คํ๊ณผ ํ
[ ์คํ ๊ตฌํํ๊ธฐ ]
: LIFO(Last-In-First-Out)์ ๋ฐ๋ผ ์๋ฃ ๋ฐฐ์ด
- ์คํ์ ์ฐ์ฐ
- pop(): ์คํ์์ ๊ฐ์ฅ ์์ ์๋ ํญ๋ชฉ ์ ๊ฑฐ
- push(item): item ํ๋๋ฅผ ์คํ์ ๊ฐ์ฅ ์ ๋ถ๋ถ์ ์ถ๊ฐ
- peek(): ์คํ์ ๊ฐ์ฅ ์์ ์๋ ํญ๋ชฉ ๋ฐํ
- isEmpty(): ์คํ์ด ๋น์ด ์์ ๋ true ๋ฐํ
- ํน์ง
- ๋ฐฐ์ด๊ณผ ๋ฌ๋ฆฌ ์คํ์ ์์ ์๊ฐ์ i๋ฒ์งธ ํญ๋ชฉ์ ์ ๊ทผํ ์ ์๋ค.
- ํ์ง๋ง ๋ฐ์ดํฐ ์ถ๊ฐ, ์ญ์ ์ฐ์ฐ์ ์์ ์๊ฐ์ ๊ฐ๋ฅํ๋ค. (๋ฐฐ์ด์ฒ๋ผ ์์๋ฅผ ํ๋์ฉ ๋ฐ์ด์ค ํ์๊ฐ ์์)
- ์คํ์ ์ฌ์ฉ
์ฌ๊ท ์๊ณ ๋ฆฌ์ฆ
์ฌ๊ท์ ์ผ๋ก ํจ์๋ฅผ ํธ์ถํด์ผ ํ๋ ๊ฒฝ์ฐ ์์ ๋ฐ์ดํฐ๋ฅผ ์คํ์ ๋ฃ์ด์ฃผ๊ณ , ์ฌ๊ทํจ์๋ฅผ ๋น ์ ธ๋์ ๋ฐฑํธ๋ํน์ ํ ๋๋ ์คํ์ ๋ฃ์ด ๋์๋ ์์ ๋ฐ์ดํฐ๋ฅผ ๋นผ์ค์ผ ํ๋ค. ์คํ์ ์ด๋ฐ ํ์๋ฅผ ์ง๊ด์ ์ผ๋ก ๊ฐ๋ฅํ๊ฒ ํด์ค๋ค.
[ ํ ๊ตฌํํ๊ธฐ ]
: FIFO(First-In-First-Out)์ ๋ฐ๋ผ ์๋ฃ ๋ฐฐ์ด
- ํ์ ์ฐ์ฐ
- add(item): item์ ๋ฆฌ์คํธ์ ๋๋ถ๋ถ์ ์ถ๊ฐ
- remove(): ๋ฆฌ์คํธ์ ์ฒซ ๋ฒ์งธ ํญ๋ชฉ์ ์ ๊ฑฐ
- peek(): ํ์์ ๊ฐ์ฅ ์์ ์๋ ํญ๋ชฉ ๋ฐํ
- isEmpty(): ํ๊ฐ ๋น์ด ์์ ๋ true ๋ฐํ
ํ ๋ํ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ก ๊ตฌํ ๊ฐ๋ฅํ๋ค.
- ํ์ ์ฌ์ฉ
๋๋น ์ฐ์ ํ์(breadth-first search)
์ฒ๋ฆฌํด์ผ ํ ๋ ธ๋์ ๋ฆฌ์คํธ๋ฅผ ์ ์ฅํ๋ ์ฉ๋
๋ ธ๋๋ฅผ ์ ๊ทผํ ์์๋๋ก ์ฒ๋ฆฌํ ์ ์๋ค.
์บ์ ๊ตฌํ