Algorithm - low-hill/Knowledge GitHub Wiki
System design์์ ํ์ฉ๋๋ Algorithm
Sliding Window, Two Pointers, Two Heaps, backtracking, Breadth-First Search (BFS), Depth-First Search (DFS), Topological Sort, Merge Intervals, Trie (Prefix Tree), Union-Find (Disjoint Set), Flood Fill, Segment Tree
Sliding Window
Sliding window pattern์ array๋ list๋ฅผ ์ํํ๋ฉด์ โwindowโ(๋ค์๊ฐ elements) elements์ ์ถ์ ํ์ฌ ํด๊ฒฐํ๋๋ฐ ์ฌ์ฉ๋๋ ๊ธฐ์ ์ด๋ค. sliding window์ window๋ ๊ณ ์ ๋ ํฌ๊ธฐ ๋๋ ํน์ ์กฐ๊ฑด์ ๋ฐ๋ผ ํ์ฅ๋๊ฑฐ๋ ์ถ์๋ ์ ์๋ ๊ฐ๋ณ ํฌ๊ธฐ๋ ๊ฐ๋ฅํฉ๋๋ค. ์ฌ๋ผ์ด๋ฉ ์๋์ฐ ํจํด์ ์ฃผ์ ๋ชฉํ๋ window๋ฅผ minimizing ํน์ maximizingํ์ฌ ์์๋ค์ ํฉ์ด๋ unique elements์ ๊ฐฏ์์ ๊ฐ์ ์ต์ ์ ์๋ฃจ์ ์ ์ฐพ๋ ๊ฒ์ ๋๋ค.
์ ์ฉ ์ฌ๋ก
- streaming application(video์ audio)
- ๋คํธ์ํฌ ์ํ์ ๋ฐ๋ผ ์ฌ์ ํ์ง์ ๋ฒํผ๋งํ๊ณ ์ ์ด
- ๋ฐ์ดํฐ ์์ถ ์๊ณ ๋ฆฌ์ฆ
- Lempel-Ziv-Welch(LZW) ์๊ณ ๋ฆฌ์ฆ: sliding window๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ๋ณต ํจํด์ ์๋ณํ์ฌ ๋ณด๋ค ํจ์จ์ ์ธ ์ธ์ฝ๋ฉ์ด ๊ฐ๋ฅ
- ๋คํธ์ํฌ ํธ๋ํฝ ํจํด์ ๋ถ์ํ์ฌ ์ด์ ์งํ๋ ์ ์ฌ์ ์ธ DDoS ๊ณต๊ฒฉ์ ํ์ง
- Text search ์๊ณ ๋ฆฌ์ฆ
- Boyer-Moore: large text๋ด์ substring์ ํจ์จ์ ์ผ๋ก ๊ฒ์
Two Pointers
๋ฐฐ์ด, list๋ string๊ฐ์ ๋ฐ์ดํฐ๊ตฌ์กฐ๋ฅผ ๋๊ฐ์ ํฌ์ธํฐ ํน์ iterator๋ฅผ ํตํด ์ํํ์ฌ ํ์ํ๋ ๊ธฐ์ ์ด๋ค. ํด๋น ํจํด์ ๋ฐ์ดํฐ ๋ด ์์(elements) ๋น๊ต ํน์ ์์์(pairs of elements)์ ์ฒ๋ฆฌํด์ผ ํ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์ฌ์ฉ๋๋ค. ๋๊ฐ์ ํฌ์ธํฐ๋ ๋์ผํ ๋ฐฉํฅ ํน์ ๋ฐ๋ ๋ฐฉํฅ์ผ๋ก ์ด๋ํ ์ ์๊ณ , ํด๋น ์ด๋์ ํน์ ์ ์ฝ ์กฐ๊ฑด์ ๋ฐ๋ผ ๊ฒฐ์ ๋ ์ ์๋ค.
์ ์ฉ ์ฌ๋ก
- Binary search
- ์ ๋ ฌ๋ ๋ฐฐ์ด์์ ๋ ๊ฐ์ ํฌ์ธํฐ(left, right)๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒ์ ์์๋ฅผ ์ ์ง์ ์ผ๋ก ์ขํ ๋์ ๊ฐ์ ๊ฒ์
- bioinformatics applications์์ DNA sequence ๋น๊ต
- ํด๋น ๊ธฐ๋ฒ์ ์ฌ์ฉํ์ฌ ๋๊ฐ์ DNA sequence๋ฅผ ๋น๊ตํ์ฌ ๋ฐฐ์น
- merge-sort ์๊ณ ๋ฆฌ์ฆ -> Merge sort ์๊ณ ๋ฆฌ์ฆ ์ค๋ช
- left ~ midํํธ์ mid+1 ~ right๋ก ๋๊ฐ ๋ถ๋ถ์ผ๋ก ๋๋๊ณ ์ ๋ ฌ ํ ๋ค์ ๋ณํฉ
- string์ด palindromes ์ฌ๋ถ๋ฅผ ํ์ธํ๋ search ์๊ณ ๋ฆฌ์ฆ
- ๋๊ฐ์ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์์ด์ ์ ๋ ๋ฌธ์๋ฅผ ๋น๊ตํ๋ฉด์ ์ด๋
Breadth-First Search (BFS)
๋ฃจํธ ๋ ธ๋(ํน์ ๋ค๋ฅธ ์์์ ๋ ธ๋)์์ ์์ํด์ ์ธ์ ํ ๋ ธ๋๋ฅผ ๋จผ์ ํ์ํ๋ ๊ทธ๋ํ ํ์ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก, ๋ค์ ๋ ๋ฒจ๋ก ์ด๋ํ๊ธฐ ์ ์ ๊ฐ์ ๋ ๋ฒจ์ ์๋ ๋ชจ๋ ์ ์ ์ ๋ฐฉ๋ฌธํ๋ค. BFS๋ queue๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฉ๋ฌธํ ์ ์ ์ ์ถ์ ํ์ฌ ํ์ ์ถ๊ฐ๋ ์์๋๋ก ์ฒ๋ฆฌํ๋ค.
์ ์ฉ ์ฌ๋ก
- ์์ ๋คํธ์ํฌ: ์์ ๋คํธ์ํฌ์์ ๋ ์ฌ์ฉ์ ๊ฐ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ๋ฐ ์ฌ์ฉํ ์ ์๊ณ , ์ด๋ ์ฌ์ฉ์ ๊ฐ์ ๋ถ๋ฆฌ ์ ๋๋ ์ํธ ์ฐ๊ฒฐ ์๋ฅผ ๋ํ๋ผ ์ ์๋ค.
- ์น ํฌ๋กค๋ฌ: Google๊ณผ ๊ฐ์ ๊ฒ์ ์์ง์ BFS ๊ธฐ๋ฐ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ ์ด๊ธฐ URL์์ ์์ํ์ฌ ํ์ดํผ๋งํฌ๋ฅผ ๋๋น ์ฐ์ ์์๋ก ๋ฐ๋ผ๊ฐ๋ฉด์ ์น ํ์ด์ง๋ฅผ ์น ํ์ด์ง๋ฅผ ํฌ๋กค๋งํ๊ณ ์์ธ์ ์์ฑํ๋ค.
- GPS ๋ด๋น๊ฒ์ด์ : ๋๋ก ์ ํ, ๊ตํต ์ํฉ ๋ฐ ๊ฑฐ๋ฆฌ ๋ฑ ๋ค์ํ ์ ์ฝ ์กฐ๊ฑด์ ๊ณ ๋ คํ์ฌ ์ง๋์์ ๋ ์์น ์ฌ์ด์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ๋ฐ BFS๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ๋คํธ์ํฌ ๋ฐฉ์ก: ์ปดํจํฐ ๋คํธ์ํฌ์์ BFS๋ ๋คํธ์ํฌ์ ๋ชจ๋ ๋ ธ๋์ ๋ฉ์์ง๋ฅผ ์ ์กํ์ฌ ๊ฐ ๋ ธ๋๊ฐ ๋ฉ์์ง๋ฅผ ์ ํํ ํ ๋ฒ๋ง ์์ ํ๋๋ก ํ๋ ๋ธ๋ก๋์บ์คํ ์ ๊ตฌํํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Merge Intervals
๊ตฌ๊ฐ์ ์งํฉ์์ ๊ฒน์น๋ ๊ตฌ๊ฐ์ ํ๋์ ๊ตฌ๊ฐ์ผ๋ก ๋ณํฉํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ์ด ๋ฌธ์ ๋ ์์ ์ง์ ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ ๋ค์ ์ ๋ ฌ๋ ๊ตฌ๊ฐ์ ์ํํ๋ฉฐ ๊ฒน์น๋ ๊ตฌ๊ฐ์ ๋ณํฉํ์ฌ ํด๊ฒฐํ ์ ์๋ค.
์ ์ฉ ์ฌ๋ก
- ์บ๋ฆฐ๋ ์ผ์ ๊ด๋ฆฌ: ๊ฒน์น๋ ์ฝ์์ด๋ ์ด๋ฒคํธ๋ฅผ ๋ณํฉํ์ฌ ์ผ์ ๊ด๋ฆฌ์์ ์ฌ์ ์๊ฐ๋๋ฅผ ์ฐพ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์๋ค.
- ์์ ํ ๋น: ์์๊ฐ ๋์ ๊ธฐ๊ฐ์ด๋ ์ค๋ณต ์ฌ์ฉ ๊ธฐ๊ฐ์ ๊ฒฐ์ ํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ค.
- ๋คํธ์ํฌ ํธ๋ํฝ ๋ถ์: ๋คํธ์ํฌ ํธ๋ํฝ ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ๊ณ ๊ณผ๋ํ ํธ๋ํฝ์ด๋ ํผ์ก ๊ธฐ๊ฐ์ ์๋ณํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์๋ค.
- Genome ๋ฐ์ดํฐ ์ฒ๋ฆฌ: ๊ฒน์น๋ ์ ์ ์ ์์ด์ ์๋ณํ๊ฑฐ๋ ์ ์ ์ ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ๋ ๋ฐ ๋์์ด ๋ ์ ์๋ค.
Flood Fill
Flood Fill์ ๋ค์ฐจ์ ๋ฐฐ์ด์์ ํน์ ๋ ธ๋์ ์ฐ๊ฒฐ๋ ์์ญ์ ๊ฒฐ์ ํ๋ ์ฌ์ฉ๋๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ผ๋ฐ์ ์ผ๋ก ์ด๋ฏธ์ง ์ฒ๋ฆฌ ๋ฐ ์ปดํจํฐ ๊ทธ๋ํฝ์ ์ฌ์ฉ๋ฉ๋๋ค. ์ฒ์ ๋ ธ๋์์ ์์ํ์ฌ target ์์์ด๋ ๊ฐ์ ์๋ก์ด ์์/๊ฐ์ผ๋ก ๋์ฒดํ๊ณ ์ธ์ ๋ ธ๋๋ฅผ ์ฌ๊ท์ ์ผ๋ก ์ฒ๋ฆฌํ๋ค. target ์์/๊ฐ(ํน์ ์กฐ๊ฑด)์ผ๋ก ์ฐ๊ฒฐ๋ ๋ชจ๋ ๋ ธ๋๊ฐ visited๋์ด update๋ ๋๊น์ง ๊ณ์๋๋ค.
์ ์ฉ ์ฌ๋ก
- ์ด๋ฏธ์ง ํธ์ง ๋๊ตฌ
- ์ด๋ฏธ์ง ํธ์ง ๋๊ตฌ ๋ด "bucket fill" ํน์ "paint fill"๊ธฐ๋ฅ(์ฌ์ฉ์๊ฐ ํน์ ์์์ผ๋ก ์์ญ์ ์ฑ์ธ ์ ์๋)์ ์ฌ์ฉ
Reference