λ°μ΄ν° ꡬ쑰μ ꡬνκ³Ό λΆμμ ν΅ν΄ μλ°μ€ν¬λ¦½νΈ μ±λ₯μ λ§μ€ν°νμΈμ. μ΄ μ’ ν© κ°μ΄λλ λ°°μ΄, κ°μ²΄, νΈλ¦¬ λ±μ μ€μ μ½λ μμ μ ν¨κ» λ€λ£Ήλλ€.
μλ°μ€ν¬λ¦½νΈ μκ³ λ¦¬μ¦ κ΅¬ν: λ°μ΄ν° ꡬ쑰 μ±λ₯ μ¬μΈ΅ λΆμ
μΉ κ°λ°μ μΈκ³μμ μλ°μ€ν¬λ¦½νΈλ ν΄λΌμ΄μΈνΈ μ¬μ΄λμ λͺ μ€μλΆν μμ΄λ©°, μλ² μ¬μ΄λμμλ μ§λ°°μ μΈ νμ λ°ννκ³ μμ΅λλ€. μ°λ¦¬λ λλΌμ΄ μ¬μ©μ κ²½νμ ꡬμΆνκΈ° μν΄ νλ μμν¬, λΌμ΄λΈλ¬λ¦¬, μλ‘μ΄ μΈμ΄ κΈ°λ₯μ μ’ μ’ μ§μ€ν©λλ€. νμ§λ§ λͺ¨λ μΈλ ¨λ UIμ λΉ λ₯Έ APIμ μ΄λ©΄μλ λ°μ΄ν° ꡬ쑰μ μκ³ λ¦¬μ¦μ΄λΌλ κΈ°μ΄κ° κΉλ € μμ΅λλ€. μ¬λ°λ₯Έ κ²μ μ ννλ κ²μ λ²κ°μ²λΌ λΉ λ₯Έ μ ν리μΌμ΄μ κ³Ό μλ°κ° μμμ λ©μΆ°λ²λ¦¬λ μ ν리μΌμ΄μ μ μ°¨μ΄λ₯Ό λ§λ€ μ μμ΅λλ€. μ΄κ²μ λ¨μ§ νλ¬Έμ μΈ μ°μ΅μ΄ μλλΌ, μ’μ κ°λ°μμ μλν κ°λ°μλ₯Ό ꡬλΆνλ μ€μ©μ μΈ κΈ°μ μ λλ€.
μ΄ μ’ ν© κ°μ΄λλ λ΄μ₯ λ©μλλ₯Ό λ¨μν μ¬μ©νλ κ²μ λμ΄ μ κ·Έκ²λ€μ΄ κ·Έλ κ² μλνλμ§ μ΄ν΄νκΈ° μμνλ €λ μ λ¬Έ μλ°μ€ν¬λ¦½νΈ κ°λ°μλ₯Ό μν κ²μ λλ€. μ°λ¦¬λ μλ°μ€ν¬λ¦½νΈμ λ€μ΄ν°λΈ λ°μ΄ν° ꡬ쑰μ μ±λ₯ νΉμ±μ ν΄λΆνκ³ , κ³ μ μ μΈ κ΅¬μ‘°λ€μ μ²μλΆν° ꡬννλ©°, μ€μ μλ리μ€μμ κ·Έ ν¨μ¨μ±μ λΆμνλ λ°©λ²μ λ°°μΈ κ²μ λλ€. μ΄ κΈμ λκΉμ§ μ½μΌμλ©΄ μ ν리μΌμ΄μ μ μλ, νμ₯μ±, μ¬μ©μ λ§μ‘±λμ μ§μ μ μΈ μν₯μ λ―ΈμΉλ μ 보μ μ κ°ν κ²°μ μ λ΄λ¦΄ μ μλ λ₯λ ₯μ κ°μΆκ² λ κ²μ λλ€.
μ±λ₯μ μΈμ΄: λΉ μ€(Big O) νκΈ°λ² κ°λ¨ μ 리
μ½λλ‘ λ°μ΄λ€κΈ° μ μ, μ°λ¦¬λ μ±λ₯μ λ ΌμνκΈ° μν 곡ν΅μ μΈμ΄κ° νμν©λλ€. κ·Έ μΈμ΄λ λ°λ‘ λΉ μ€ νκΈ°λ²μ λλ€. λΉ μ€λ μ λ ₯ ν¬κΈ°('n'μΌλ‘ νκΈ°)κ° μ»€μ§μ λ°λΌ μκ³ λ¦¬μ¦μ μ€ν μκ°μ΄λ κ³΅κ° μꡬ μ¬νμ΄ μ΄λ»κ² νμ₯λλμ§μ λν μ΅μ μ μλ리μ€λ₯Ό μ€λͺ ν©λλ€. μ΄κ²μ μλλ₯Ό λ°λ¦¬μ΄ λ¨μλ‘ μΈ‘μ νλ κ²μ΄ μλλΌ, μ°μ°μ μ±μ₯ 곑μ μ μ΄ν΄νλ κ²μ κ΄ν κ²μ λλ€.
μ¬λ¬λΆμ΄ λ§μ£ΌμΉ κ°μ₯ μΌλ°μ μΈ λ³΅μ‘λλ λ€μκ³Ό κ°μ΅λλ€:
- O(1) - μμ μκ°(Constant Time): μ±λ₯μ μ±λ°°μ λλ€. μ°μ°μ μλ£νλ λ° κ±Έλ¦¬λ μκ°μ μ λ ₯ λ°μ΄ν°μ ν¬κΈ°μ κ΄κ³μμ΄ μΌμ ν©λλ€. μΈλ±μ€λ₯Ό μ¬μ©νμ¬ λ°°μ΄μμ νλͺ©μ κ°μ Έμ€λ κ²μ΄ λνμ μΈ μμ λλ€.
- O(log n) - λ‘κ·Έ μκ°(Logarithmic Time): μ€ν μκ°μ΄ μ λ ₯ ν¬κΈ°μ λ°λΌ λ‘κ·Έμ μΌλ‘ μ¦κ°ν©λλ€. μ΄κ²μ μμ²λκ² ν¨μ¨μ μ λλ€. μ λ ₯ ν¬κΈ°λ₯Ό λ λ°°λ‘ λ릴 λλ§λ€ μ°μ° νμλ λ¨ ν λ²λ§ μ¦κ°ν©λλ€. κ· ν μ‘ν μ΄μ§ νμ νΈλ¦¬μμ κ²μνλ κ²μ΄ μ£Όμ μμ λλ€.
- O(n) - μ ν μκ°(Linear Time): μ€ν μκ°μ΄ μ λ ₯ ν¬κΈ°μ μ λΉλ‘νμ¬ μ¦κ°ν©λλ€. μ λ ₯μ΄ 10κ° νλͺ©μ΄λ©΄ 10 'λ¨κ³'κ° κ±Έλ¦½λλ€. 1,000,000κ° νλͺ©μ΄λ©΄ 1,000,000 'λ¨κ³'κ° κ±Έλ¦½λλ€. μ λ ¬λμ§ μμ λ°°μ΄μμ κ°μ κ²μνλ κ²μ΄ μΌλ°μ μΈ O(n) μ°μ°μ λλ€.
- O(n log n) - λ‘κ·Έ μ ν μκ°(Log-Linear Time): λ³ν© μ λ ¬μ΄λ ν μ λ ¬κ³Ό κ°μ μ λ ¬ μκ³ λ¦¬μ¦μ λ§€μ° μΌλ°μ μ΄κ³ ν¨μ¨μ μΈ λ³΅μ‘λμ λλ€. λ°μ΄ν°κ° μ¦κ°ν¨μ λ°λΌ μ νμ₯λ©λλ€.
- O(n^2) - μ΄μ°¨ μκ°(Quadratic Time): μ€ν μκ°μ΄ μ λ ₯ ν¬κΈ°μ μ κ³±μ λΉλ‘ν©λλ€. μ¬κΈ°μλΆν° μν©μ΄ λΉ λ₯΄κ² λλ €μ§κΈ° μμν©λλ€. λμΌν 컬λ μ μ λν μ€μ²© 루νκ° μΌλ°μ μΈ μμΈμ λλ€. κ°λ¨ν λ²λΈ μ λ ¬μ΄ λνμ μΈ μμ λλ€.
- O(2^n) - μ§μ μκ°(Exponential Time): μ λ ₯μ μλ‘μ΄ μμκ° μΆκ°λ λλ§λ€ μ€ν μκ°μ΄ λ λ°°κ° λ©λλ€. μ΄λ¬ν μκ³ λ¦¬μ¦μ μμ£Ό μμ λ°μ΄ν°μ μ μ μΈνκ³ λ μΌλ°μ μΌλ‘ νμ₯ κ°λ₯νμ§ μμ΅λλ€. λ©λͺ¨μ΄μ μ΄μ μλ νΌλ³΄λμΉ μμ μ¬κ·μ κ³μ°μ΄ ν μμ λλ€.
λΉ μ€λ₯Ό μ΄ν΄νλ κ²μ κΈ°λ³Έμ λλ€. μ΄λ₯Ό ν΅ν΄ λ¨ ν μ€μ μ½λλ₯Ό μ€ννμ§ μκ³ λ μ±λ₯μ μμΈ‘νκ³ , κ·λͺ¨μ μνμ 견λ μ μλ μν€ν μ² κ²°μ μ λ΄λ¦΄ μ μμ΅λλ€.
μλ°μ€ν¬λ¦½νΈ λ΄μ₯ λ°μ΄ν° ꡬ쑰: μ±λ₯ ν΄λΆ
μλ°μ€ν¬λ¦½νΈλ κ°λ ₯ν λ΄μ₯ λ°μ΄ν° ꡬ쑰 μΈνΈλ₯Ό μ 곡ν©λλ€. κ·Έλ€μ κ°μ κ³Ό μ½μ μ μ΄ν΄νκΈ° μν΄ μ±λ₯ νΉμ±μ λΆμν΄ λ΄ μλ€.
μ΄λμλ μλ λ°°μ΄(Array)
μλ°μ€ν¬λ¦½νΈ `Array`λ μλ§λ κ°μ₯ λ§μ΄ μ¬μ©λλ λ°μ΄ν° κ΅¬μ‘°μΌ κ²μ λλ€. κ°μ μμ μλ λͺ©λ‘μ΄μ£ . λ΄λΆμ μΌλ‘ μλ°μ€ν¬λ¦½νΈ μμ§μ λ°°μ΄μ λ§€μ° μ΅μ ννμ§λ§, κ·Έ κ·Όλ³Έμ μΈ μμ±μ μ¬μ ν μ»΄ν¨ν° κ³Όν μμΉμ λ°λ¦ λλ€.
- μ κ·Ό (μΈλ±μ€ κΈ°μ€): O(1) - νΉμ μΈλ±μ€μ μμμ μ κ·Όνλ κ²(μ: `myArray[5]`)μ μ»΄ν¨ν°κ° λ©λͺ¨λ¦¬ μ£Όμλ₯Ό μ§μ κ³μ°ν μ μκΈ° λλ¬Έμ μμ²λκ² λΉ λ¦ λλ€.
- Push (λμ μΆκ°): νκ· O(1) - λμ μμλ₯Ό μΆκ°νλ κ²μ μΌλ°μ μΌλ‘ λ§€μ° λΉ λ¦ λλ€. μλ°μ€ν¬λ¦½νΈ μμ§μ λ©λͺ¨λ¦¬λ₯Ό 미리 ν λΉνλ―λ‘, λκ° κ°μ μ€μ νλ λ¬Έμ μΌ λΏμ λλ€. κ°λ λ°°μ΄μ ν¬κΈ°λ₯Ό μ‘°μ νκ³ λ³΅μ¬ν΄μΌ νλ κ²½μ°κ° μλλ°, μ΄λ O(n) μ°μ°μ΄μ§λ§ λλ¬ΌκΈ° λλ¬Έμ λΆν μν μκ° λ³΅μ‘λλ O(1)μ΄ λ©λλ€.
- Pop (λμμ μ κ±°): O(1) - λ§μ§λ§ μμλ₯Ό μ κ±°νλ κ²λ λ€λ₯Έ μμλ₯Ό λ€μ μΈλ±μ±ν νμκ° μμΌλ―λ‘ λ§€μ° λΉ λ¦ λλ€.
- Unshift (μμ λΆλΆμ μΆκ°): O(n) - μ΄κ²μ μ±λ₯μ ν¨μ μ λλ€! μμ λΆλΆμ μμλ₯Ό μΆκ°νλ €λ©΄ λ°°μ΄μ λ€λ₯Έ λͺ¨λ μμλ₯Ό μ€λ₯Έμͺ½μΌλ‘ ν μΉΈμ© μ΄λν΄μΌ ν©λλ€. λΉμ©μ λ°°μ΄μ ν¬κΈ°μ λ°λΌ μ νμ μΌλ‘ μ¦κ°ν©λλ€.
- Shift (μμ λΆλΆμμ μ κ±°): O(n) - λ§μ°¬κ°μ§λ‘ 첫 λ²μ§Έ μμλ₯Ό μ κ±°νλ €λ©΄ λͺ¨λ νμ μμλ₯Ό μΌμͺ½μΌλ‘ ν μΉΈμ© μ΄λν΄μΌ ν©λλ€. μ±λ₯μ΄ μ€μν 루νμμ ν° λ°°μ΄μ λν΄ μ΄ μμ μ νΌνμΈμ.
- κ²μ (μ: `indexOf`, `includes`): O(n) - μμλ₯Ό μ°ΎκΈ° μν΄ μλ°μ€ν¬λ¦½νΈλ μΌμΉνλ κ²μ μ°Ύμ λκΉμ§ μ²μλΆν° λͺ¨λ λ¨μΌ μμλ₯Ό νμΈν΄μΌ ν μ μμ΅λλ€.
- Splice / Slice: O(n) - μ€κ°μ μ½μ /μμ νκ±°λ νμ λ°°μ΄μ λ§λλ λ λ©μλ λͺ¨λ μΌλ°μ μΌλ‘ λ°°μ΄μ μΌλΆλ₯Ό λ€μ μΈλ±μ±νκ±°λ 볡μ¬ν΄μΌ νλ―λ‘ μ ν μκ° μ°μ°μ΄ λ©λλ€.
ν΅μ¬ μμ½: λ°°μ΄μ μΈλ±μ€λ‘ λΉ λ₯Έ μ κ·Όκ³Ό λμμ νλͺ©μ μΆκ°/μ κ±°νλ λ° νμμ μ λλ€. μμμ΄λ μ€κ°μμ νλͺ©μ μΆκ°/μ κ±°νλ λ°λ λΉν¨μ¨μ μ λλ€.
λ€μ¬λ€λ₯ν κ°μ²΄(Object) (ν΄μ λ§΅μΌλ‘μ)
μλ°μ€ν¬λ¦½νΈ κ°μ²΄λ ν€-κ° μμ 컬λ μ μ λλ€. λ§μ μ©λλ‘ μ¬μ©λ μ μμ§λ§, λ°μ΄ν° ꡬ쑰λ‘μμ μ£Όλ μν μ ν΄μ λ§΅(λλ λμ λ리)μ μν μ λλ€. ν΄μ ν¨μλ ν€λ₯Ό λ°μ μΈλ±μ€λ‘ λ³ννκ³ , κ·Έ μμΉμ λ©λͺ¨λ¦¬μ κ°μ μ μ₯ν©λλ€.
- μ½μ / μ λ°μ΄νΈ: νκ· O(1) - μλ‘μ΄ ν€-κ° μμ μΆκ°νκ±°λ κΈ°μ‘΄ κ²μ μ λ°μ΄νΈνλ κ²μ ν΄μλ₯Ό κ³μ°νκ³ λ°μ΄ν°λ₯Ό λ°°μΉνλ κ²μ ν¬ν¨ν©λλ€. μ΄κ²μ μΌλ°μ μΌλ‘ μμ μκ°μ λλ€.
- μμ : νκ· O(1) - ν€-κ° μμ μ κ±°νλ κ²λ νκ· μ μΌλ‘ μμ μκ° μ°μ°μ λλ€.
- μ‘°ν (ν€λ‘ μ κ·Ό): νκ· O(1) - μ΄κ²μ΄ κ°μ²΄μ μ΄λ₯λ ₯μ λλ€. κ°μ²΄μ μΌλ§λ λ§μ ν€κ° μλ μκ΄μμ΄ ν€λ‘ κ°μ κ²μνλ κ²μ λ§€μ° λΉ λ¦ λλ€.
"νκ· μ μΌλ‘"λΌλ μ©μ΄λ μ€μν©λλ€. λλ¬Όκ² λ°μνλ ν΄μ μΆ©λ(μλ‘ λ€λ₯Έ λ ν€κ° λμΌν ν΄μ μΈλ±μ€λ₯Ό μμ±νλ κ²½μ°)μ κ²½μ°, κ΅¬μ‘°κ° ν΄λΉ μΈλ±μ€μ μλ μμ νλͺ© λͺ©λ‘μ λ°λ³΅ν΄μΌ νλ―λ‘ μ±λ₯μ΄ O(n)μΌλ‘ μ νλ μ μμ΅λλ€. κ·Έλ¬λ μ΅μ μλ°μ€ν¬λ¦½νΈ μμ§μ λ°μ΄λ ν΄μ± μκ³ λ¦¬μ¦μ κ°μ§κ³ μμ΄ λλΆλΆμ μ ν리μΌμ΄μ μμλ λ¬Έμ κ° λμ§ μμ΅λλ€.
ES6μ κ°λ ₯ν κΈ°λ₯: Setκ³Ό Map
ES6λ `Map`κ³Ό `Set`μ λμ νμ¬ νΉμ μμ μ λν΄ κ°μ²΄μ λ°°μ΄μ μ¬μ©νλ κ²λ³΄λ€ λ μ λ¬Έμ μ΄κ³ μ’ μ’ λ μ±λ₯μ΄ μ’μ λμμ μ 곡ν©λλ€.
Set: `Set`μ κ³ μ ν κ°μ 컬λ μ μ λλ€. μ€λ³΅μ΄ μλ λ°°μ΄κ³Ό κ°μ΅λλ€.
- `add(value)`: νκ· O(1).
- `has(value)`: νκ· O(1). μ΄κ²μ΄ O(n)μΈ λ°°μ΄μ `includes()` λ©μλμ λΉν΄ κ°λ ν΅μ¬ μ΄μ μ λλ€.
- `delete(value)`: νκ· O(1).
`Set`μ κ³ μ ν νλͺ© λͺ©λ‘μ μ μ₯νκ³ κ·Έ μ‘΄μ¬ μ¬λΆλ₯Ό μμ£Ό νμΈν΄μΌ ν λ μ¬μ©νμΈμ. μλ₯Ό λ€μ΄, μ¬μ©μ IDκ° μ΄λ―Έ μ²λ¦¬λμλμ§ νμΈν λμ λλ€.
Map: `Map`μ κ°μ²΄μ μ μ¬νμ§λ§ λͺ κ°μ§ μ€μν μ΄μ μ΄ μμ΅λλ€. ν€κ° λͺ¨λ λ°μ΄ν° νμ (κ°μ²΄μ²λΌ λ¬Έμμ΄μ΄λ μ¬λ³ΌλΏλ§ μλλΌ)μ΄ λ μ μλ ν€-κ° μμ 컬λ μ μ λλ€. λν μ½μ μμλ₯Ό μ μ§ν©λλ€.
- `set(key, value)`: νκ· O(1).
- `get(key)`: νκ· O(1).
- `has(key)`: νκ· O(1).
- `delete(key)`: νκ· O(1).
`Map`μ λμ λ리/ν΄μ λ§΅μ΄ νμνκ³ ν€κ° λ¬Έμμ΄μ΄ μλ μ μκ±°λ μμμ μμλ₯Ό 보μ₯ν΄μΌ ν λ μ¬μ©νμΈμ. μΌλ°μ μΌλ‘ μΌλ° κ°μ²΄λ³΄λ€ ν΄μ λ§΅ λͺ©μ μΌλ‘ λ κ²¬κ³ ν μ νμΌλ‘ κ°μ£Όλ©λλ€.
κ³ μ λ°μ΄ν° ꡬ쑰 μ§μ ꡬννκ³ λΆμνκΈ°
μ±λ₯μ μ§μ μΌλ‘ μ΄ν΄νλ €λ©΄ μ΄λ¬ν ꡬ쑰λ₯Ό μ§μ λ§λ€μ΄λ³΄λ κ²λ§ ν κ²μ΄ μμ΅λλ€. μ΄λ κ΄λ ¨λ νΈλ μ΄λμ€νμ λν μ΄ν΄λ₯Ό μ¬νμν΅λλ€.
μ°κ²° 리μ€νΈ(Linked List): λ°°μ΄μ μ‘±μμμ λ²μ΄λκΈ°
μ°κ²° 리μ€νΈλ μμλ€μ΄ μ°μμ μΈ λ©λͺ¨λ¦¬ μμΉμ μ μ₯λμ§ μλ μ ν λ°μ΄ν° ꡬ쑰μ λλ€. λμ , κ° μμ('λ Έλ')λ μμ μ λ°μ΄ν°μ μνμ€μ λ€μ λ Έλλ₯Ό κ°λ¦¬ν€λ ν¬μΈν°λ₯Ό ν¬ν¨ν©λλ€. μ΄ κ΅¬μ‘°λ λ°°μ΄μ μ½μ μ μ§μ μ μΌλ‘ ν΄κ²°ν©λλ€.
λ¨μΌ μ°κ²° 리μ€νΈ λ Έλμ 리μ€νΈ ꡬν:
// Node ν΄λμ€λ 리μ€νΈμ κ° μμλ₯Ό λνλ λλ€ class Node { constructor(data, next = null) { this.data = data; this.next = next; } } // LinkedList ν΄λμ€λ λ Έλλ€μ κ΄λ¦¬ν©λλ€ class LinkedList { constructor() { this.head = null; // 첫 λ²μ§Έ λ Έλ this.size = 0; } // μμ λΆλΆμ μ½μ (μμ μΆκ°) insertFirst(data) { this.head = new Node(data, this.head); this.size++; } // ... insertLast, insertAt, getAt, removeAt κ°μ λ€λ₯Έ λ©μλλ€ ... }
λ°°μ΄ λλΉ μ±λ₯ λΆμ:
- μμ λΆλΆμμμ μ½μ /μμ : O(1). μ΄κ²μ΄ μ°κ²° 리μ€νΈμ κ°μ₯ ν° μ₯μ μ λλ€. μμ λΆλΆμ μ λ Έλλ₯Ό μΆκ°νλ €λ©΄ κ·Έλ₯ λ§λ€μ΄μ `next`κ° μ΄μ `head`λ₯Ό κ°λ¦¬ν€κ² νλ©΄ λ©λλ€. μ¬μΈλ±μ±μ΄ νμ μμ΅λλ€! μ΄λ λ°°μ΄μ O(n) `unshift`μ `shift`μ λΉν΄ μμ²λ κ°μ μ λλ€.
- λ/μ€κ°μμμ μ½μ /μμ : μ¬λ°λ₯Έ μμΉλ₯Ό μ°ΎκΈ° μν΄ λ¦¬μ€νΈλ₯Ό μνν΄μΌ νλ―λ‘ O(n) μ°μ°μ΄ λ©λλ€. λμ μΆκ°νλ κ²μ μ’ μ’ λ°°μ΄μ΄ λ λΉ λ¦ λλ€. μ΄μ€ μ°κ²° 리μ€νΈ(λ€μ λ Έλμ μ΄μ λ Έλ λͺ¨λμ λν ν¬μΈν°κ° μμ)λ μμ λ λ Έλμ λν μ°Έμ‘°κ° μ΄λ―Έ μλ κ²½μ° μμ λ₯Ό μ΅μ ννμ¬ O(1)λ‘ λ§λ€ μ μμ΅λλ€.
- μ κ·Ό/κ²μ: O(n). μ§μ μ μΈ μΈλ±μ€κ° μμ΅λλ€. 100λ²μ§Έ μμλ₯Ό μ°ΎμΌλ €λ©΄ `head`μμ μμνμ¬ 99κ°μ λ Έλλ₯Ό μνν΄μΌ ν©λλ€. μ΄λ λ°°μ΄μ O(1) μΈλ±μ€ μ κ·Όμ λΉν΄ μλΉν λ¨μ μ λλ€.
μ€ν(Stack)κ³Ό ν(Queue): μμμ νλ¦ κ΄λ¦¬νκΈ°
μ€νκ³Ό νλ κΈ°λ³Έ ꡬν보λ€λ λμμ μν΄ μ μλλ μΆμ λ°μ΄ν° νμ μ λλ€. μμ , μ°μ°, λ°μ΄ν° νλ¦μ κ΄λ¦¬νλ λ° μ€μν©λλ€.
μ€ν (LIFO - νμ μ μΆ): μ μ λλ―Έλ₯Ό μμν΄λ³΄μΈμ. μ μλ₯Ό 맨 μμ μΆκ°νκ³ , 맨 μμμ μ μλ₯Ό μ κ±°ν©λλ€. λ§μ§λ§μ λμ κ²μ΄ κ°μ₯ λ¨Όμ κΊΌλ΄λ κ²μ λλ€.
- λ°°μ΄λ‘ ꡬν: κ°λ¨νκ³ ν¨μ¨μ μ λλ€. `push()`λ₯Ό μ¬μ©νμ¬ μ€νμ μΆκ°νκ³ `pop()`μ μ¬μ©νμ¬ μ κ±°ν©λλ€. λ λ€ O(1) μ°μ°μ λλ€.
- μ°κ²° 리μ€νΈλ‘ ꡬν: μ΄κ²λ λ§€μ° ν¨μ¨μ μ λλ€. `insertFirst()`λ₯Ό μ¬μ©νμ¬ μΆκ°(push)νκ³ `removeFirst()`λ₯Ό μ¬μ©νμ¬ μ κ±°(pop)ν©λλ€. λ λ€ O(1) μ°μ°μ λλ€.
ν (FIFO - μ μ μ μΆ): λ§€νμ μμ μ€μ μμν΄λ³΄μΈμ. μ€μ κ°μ₯ λ¨Όμ μ μ¬λμ΄ κ°μ₯ λ¨Όμ μλΉμ€λ₯Ό λ°μ΅λλ€.
- λ°°μ΄λ‘ ꡬν: μ΄κ²μ μ±λ₯μ ν¨μ μ λλ€! νμ λμ μΆκ°(enqueue)νλ €λ©΄ `push()`(O(1))λ₯Ό μ¬μ©ν©λλ€. κ·Έλ¬λ μμμ μ κ±°(dequeue)νλ €λ©΄ `shift()`(O(n))λ₯Ό μ¬μ©ν΄μΌ ν©λλ€. μ΄κ²μ ν° νμ λΉν¨μ¨μ μ λλ€.
- μ°κ²° 리μ€νΈλ‘ ꡬν: μ΄κ²μ΄ μ΄μμ μΈ κ΅¬νμ λλ€. 리μ€νΈμ λ(tail)μ λ Έλλ₯Ό μΆκ°νμ¬ enqueueνκ³ , μμ(head)μμ λ Έλλ₯Ό μ κ±°νμ¬ dequeueν©λλ€. headμ tail λͺ¨λμ λν μ°Έμ‘°κ° μμΌλ©΄ λ μ°μ° λͺ¨λ O(1)μ λλ€.
μ΄μ§ νμ νΈλ¦¬(BST): μλλ₯Ό μν μ‘°μ§ν
μ λ ¬λ λ°μ΄ν°κ° μμ λ, O(n) κ²μλ³΄λ€ ν¨μ¬ λ μν μ μμ΅λλ€. μ΄μ§ νμ νΈλ¦¬λ λͺ¨λ λ Έλκ° κ°, μΌμͺ½ μμ, μ€λ₯Έμͺ½ μμμ κ°λ λ Έλ κΈ°λ° νΈλ¦¬ λ°μ΄ν° ꡬ쑰μ λλ€. ν΅μ¬ μμ±μ νΉμ λ Έλμ λν΄ μΌμͺ½ νμ νΈλ¦¬μ λͺ¨λ κ°μ κ·Έ λ Έλμ κ°λ³΄λ€ μκ³ , μ€λ₯Έμͺ½ νμ νΈλ¦¬μ λͺ¨λ κ°μ λ ν¬λ€λ κ²μ λλ€.
BST λ Έλμ νΈλ¦¬ ꡬν:
class Node { constructor(data) { this.data = data; this.left = null; this.right = null; } } class BinarySearchTree { constructor() { this.root = null; } insert(data) { const newNode = new Node(data); if (this.root === null) { this.root = newNode; } else { this.insertNode(this.root, newNode); } } // μ¬κ· ν¬νΌ ν¨μ insertNode(node, newNode) { if (newNode.data < node.data) { if (node.left === null) { node.left = newNode; } else { this.insertNode(node.left, newNode); } } else { if (node.right === null) { node.right = newNode; } else { this.insertNode(node.right, newNode); } } } // ... search λ° remove λ©μλ ... }
μ±λ₯ λΆμ:
- κ²μ, μ½μ , μμ : κ· ν μ‘ν νΈλ¦¬μμ μ΄ λͺ¨λ μ°μ°μ O(log n)μ λλ€. μ΄λ κ° λΉκ΅λ§λ€ λλ¨Έμ§ λ Έλμ μ λ°μ μ κ±°νκΈ° λλ¬Έμ λλ€. μ΄κ²μ λ§€μ° κ°λ ₯νκ³ νμ₯ κ°λ₯ν©λλ€.
- λΆκ· ν νΈλ¦¬ λ¬Έμ : O(log n) μ±λ₯μ νΈλ¦¬κ° κ· νμ μ΄λ£¨κ³ μλμ§μ μ μ μΌλ‘ λ¬λ € μμ΅λλ€. λ§μ½ μ λ ¬λ λ°μ΄ν°(μ: 1, 2, 3, 4, 5)λ₯Ό κ°λ¨ν BSTμ μ½μ νλ©΄ μ°κ²° 리μ€νΈλ‘ λ³μ§λ©λλ€. λͺ¨λ λ Έλκ° μ€λ₯Έμͺ½ μμμ΄ λ κ²μ λλ€. μ΄ μ΅μ μ κ²½μ°, λͺ¨λ μ°μ°μ μ±λ₯μ O(n)μΌλ‘ μ νλ©λλ€. μ΄κ²μ΄ AVL νΈλ¦¬λ λ λ-λΈλ νΈλ¦¬μ κ°μ λ λ°μ λ μκ° κ· ν νΈλ¦¬κ° μ‘΄μ¬νλ μ΄μ μ΄λ©°, ꡬνμ λ 볡μ‘ν©λλ€.
κ·Έλν(Graph): 볡μ‘ν κ΄κ³ λͺ¨λΈλ§νκΈ°
κ·Έλνλ κ°μ (edge)μΌλ‘ μ°κ²°λ λ Έλ(μ μ , vertex)μ μ§ν©μ λλ€. μμ λ€νΈμν¬, λλ‘ μ§λ, μ»΄ν¨ν° λ€νΈμν¬ λ± λ€νΈμν¬λ₯Ό λͺ¨λΈλ§νλ λ° μλ²½ν©λλ€. μ½λμμ κ·Έλνλ₯Ό μ΄λ»κ² ννν μ§ μ ννλ κ²μ μ£Όμ μ±λ₯μ μν₯μ λ―ΈμΉ©λλ€.
μΈμ νλ ¬(Adjacency Matrix): V x V ν¬κΈ°μ 2μ°¨μ λ°°μ΄(νλ ¬) (μ¬κΈ°μ Vλ μ μ μ μ). μ μ `i`μμ `j`λ‘ κ°λ κ°μ μ΄ μμΌλ©΄ `matrix[i][j] = 1`, κ·Έλ μ§ μμΌλ©΄ 0μ λλ€.
- μ₯μ : λ μ μ μ¬μ΄μ κ°μ μ‘΄μ¬ μ¬λΆ νμΈμ΄ O(1)μ λλ€.
- λ¨μ : O(V^2) 곡κ°μ μ¬μ©νμ¬ ν¬μ κ·Έλν(κ°μ μ΄ μ μ κ·Έλν)μ λ§€μ° λΉν¨μ¨μ μ λλ€. ν μ μ μ λͺ¨λ μ΄μμ μ°Ύλ λ° O(V) μκ°μ΄ 걸립λλ€.
μΈμ 리μ€νΈ(Adjacency List): 리μ€νΈμ λ°°μ΄(λλ λ§΅). λ°°μ΄μ μΈλ±μ€ `i`λ μ μ `i`λ₯Ό λνλ΄κ³ , ν΄λΉ μΈλ±μ€μ 리μ€νΈλ `i`κ° κ°μ μ κ°μ§ λͺ¨λ μ μ μ ν¬ν¨ν©λλ€.
- μ₯μ : κ³΅κ° ν¨μ¨μ μ΄λ©°, O(V + E) 곡κ°μ μ¬μ©ν©λλ€ (μ¬κΈ°μ Eλ κ°μ μ μ). ν μ μ μ λͺ¨λ μ΄μμ μ°Ύλ κ²μ΄ ν¨μ¨μ μ λλ€ (μ΄μμ μμ λΉλ‘).
- λ¨μ : μ£Όμ΄μ§ λ μ μ μ¬μ΄μ κ°μ μ‘΄μ¬ μ¬λΆλ₯Ό νμΈνλ λ° O(log k) λλ O(k)κΉμ§ λ μ€λ 걸릴 μ μμ΅λλ€ (μ¬κΈ°μ kλ μ΄μμ μ).
μΉμμ λλΆλΆμ μ€μ μ ν리μΌμ΄μ μμ κ·Έλνλ ν¬μνλ―λ‘, μΈμ 리μ€νΈκ° ν¨μ¬ λ μΌλ°μ μ΄κ³ μ±λ₯μ΄ μ’μ μ νμ λλ€.
μ€μΈκ³μμμ μ€μ©μ μΈ μ±λ₯ μΈ‘μ
μ΄λ‘ μ μΈ λΉ μ€λ κ°μ΄λμ΄μ§λ§, λλ‘λ ꡬ체μ μΈ μ«μκ° νμν©λλ€. μ½λμ μ€μ μ€ν μκ°μ μ΄λ»κ² μΈ‘μ ν κΉμ?
μ΄λ‘ μ λμ΄: μ½λ μκ° μ ννκ² μΈ‘μ νκΈ°
`Date.now()`λ₯Ό μ¬μ©νμ§ λ§μΈμ. κ³ μ λ° λ²€μΉλ§νΉμ μν΄ μ€κ³λμ§ μμμ΅λλ€. λμ λΈλΌμ°μ μ Node.js λͺ¨λμμ μ¬μ© κ°λ₯ν Performance APIλ₯Ό μ¬μ©νμΈμ.
`performance.now()`λ₯Ό μ¬μ©ν κ³ μ λ° νμ΄λ°:
// μ: Array.unshiftμ LinkedList μ½μ λΉκ΅ const hugeArray = Array.from({ length: 100000 }, (_, i) => i); const hugeLinkedList = new LinkedList(); // ꡬνλμλ€κ³ κ°μ for(let i = 0; i < 100000; i++) { hugeLinkedList.insertLast(i); } // Array.unshift ν μ€νΈ const startTimeArray = performance.now(); hugeArray.unshift(-1); const endTimeArray = performance.now(); console.log(`Array.unshiftλ ${endTimeArray - startTimeArray} λ°λ¦¬μ΄κ° κ±Έλ Έμ΅λλ€.`); // LinkedList.insertFirst ν μ€νΈ const startTimeLL = performance.now(); hugeLinkedList.insertFirst(-1); const endTimeLL = performance.now(); console.log(`LinkedList.insertFirstλ ${endTimeLL - startTimeLL} λ°λ¦¬μ΄κ° κ±Έλ Έμ΅λλ€.`);
μ΄κ²μ μ€ννλ©΄ κ·Ήμ μΈ μ°¨μ΄λ₯Ό λ³΄κ² λ κ²μ λλ€. μ°κ²° 리μ€νΈ μ½μ μ κ±°μ μ¦κ°μ μΈ λ°λ©΄, λ°°μ΄ unshiftλ λμ λλ μκ°μ΄ 걸리며, μ΄λ O(1) λ O(n) μ΄λ‘ μ μ€μ λ‘ μ¦λͺ ν©λλ€.
V8 μμ§μ΄λΌλ λ³μ: 보μ΄μ§ μλ κ²λ€
μλ°μ€ν¬λ¦½νΈ μ½λκ° μ§κ³΅ μνμμ μ€νλμ§ μλλ€λ κ²μ κΈ°μ΅νλ κ²μ΄ μ€μν©λλ€. κ·Έκ²μ V8(Chrome λ° Node.jsμμ)κ³Ό κ°μ λ§€μ° μ κ΅ν μμ§μ μν΄ μ€νλ©λλ€. V8μ λλΌμ΄ JIT(Just-In-Time) μ»΄νμΌ λ° μ΅μ ν νΈλ¦μ μνν©λλ€.
- νλ ν΄λμ€ (Shapes): V8μ λμΌν μμλ‘ λμΌν μμ± ν€λ₯Ό κ°μ§ κ°μ²΄μ λν΄ μ΅μ νλ 'λͺ¨μ'μ λ§λλλ€. μ΄λ₯Ό ν΅ν΄ μμ± μ κ·Όμ΄ κ±°μ λ°°μ΄ μΈλ±μ€ μ κ·Όλ§νΌ λΉ¨λΌμ§ μ μμ΅λλ€.
- μΈλΌμΈ μΊμ±: V8μ νΉμ μμ μμ λ³Έ κ°μ μ νμ κΈ°μ΅νκ³ μΌλ°μ μΈ κ²½μ°μ λν΄ μ΅μ νν©λλ€.
μ΄κ²μ΄ λΉμ μκ² μλ―Ένλ λ°λ 무μμΌκΉμ? λλ‘λ λΉ μ€ κ΄μ μμ μ΄λ‘ μ μΌλ‘ λ λλ¦° μμ μ΄ μμ§ μ΅μ νλ‘ μΈν΄ μμ λ°μ΄ν°μ μμλ μ€μ λ‘ λ λΉ λ₯Ό μ μλ€λ κ²μ μλ―Έν©λλ€. μλ₯Ό λ€μ΄, λ§€μ° μμ `n`μ λν΄ `shift()`λ₯Ό μ¬μ©νλ λ°°μ΄ κΈ°λ° νλ λ Έλ κ°μ²΄ μμ±μ μ€λ²ν€λμ V8μ μ΅μ νλ λ€μ΄ν°λΈ λ°°μ΄ μμ μ μμν μλ λλ¬Έμ λ§μΆ€νμΌλ‘ μ μλ μ°κ²° 리μ€νΈ νλ³΄λ€ μ€μ λ‘ μ±λ₯μ΄ λ μ’μ μ μμ΅λλ€. κ·Έλ¬λ `n`μ΄ μ»€μ§λ©΄ νμ λΉ μ€κ° μ΄κΉλλ€. νμ₯μ±μ μν μ£Όμ κ°μ΄λλ‘ νμ λΉ μ€λ₯Ό μ¬μ©νμΈμ.
κΆκ·Ήμ μΈ μ§λ¬Έ: μ΄λ€ λ°μ΄ν° ꡬ쑰λ₯Ό μ¬μ©ν΄μΌ ν κΉ?
μ΄λ‘ μ νλ₯νμ§λ§, ꡬ체μ μ΄κ³ μ λ°μ μΈ κ°λ° μλ리μ€μ μ μ©ν΄ λ΄ μλ€.
-
μλλ¦¬μ€ 1: μ¬μ©μκ° λ
Έλλ₯Ό μΆκ°, μ κ±°, μ¬μ λ ¬ν μ μλ μμ
νλ μ΄λ¦¬μ€νΈ κ΄λ¦¬νκΈ°.
λΆμ: μ¬μ©μλ μ€κ°μμ λ Έλλ₯Ό μμ£Ό μΆκ°/μ κ±°ν©λλ€. λ°°μ΄μ O(n) `splice` μ°μ°μ νμλ‘ ν κ²μ λλ€. μ¬κΈ°μλ μ΄μ€ μ°κ²° 리μ€νΈκ° μ΄μμ μΌ κ²μ λλ€. λ Έλμ λν μ°Έμ‘°κ° μλ€λ©΄ λ Έλλ₯Ό μ κ±°νκ±°λ λ λ Έλ μ¬μ΄μ λ Έλλ₯Ό μ½μ νλ κ²μ΄ O(1) μ°μ°μ΄ λμ΄, κ±°λν νλ μ΄λ¦¬μ€νΈμμλ UIκ° μ¦κ°μ μΌλ‘ λκ»΄μ§κ² λ§λλλ€.
-
μλλ¦¬μ€ 2: 쿼리 λ§€κ°λ³μλ₯Ό λνλ΄λ 볡μ‘ν κ°μ²΄κ° ν€μΈ API μλ΅μ μν ν΄λΌμ΄μΈνΈ μΈ‘ μΊμ ꡬμΆνκΈ°.
λΆμ: ν€λ₯Ό κΈ°λ°μΌλ‘ ν λΉ λ₯Έ μ‘°νκ° νμν©λλ€. μΌλ° κ°μ²΄λ ν€κ° λ¬Έμμ΄λ§ κ°λ₯νκΈ° λλ¬Έμ μ€ν¨ν©λλ€. Mapμ΄ μλ²½ν ν΄κ²°μ± μ λλ€. κ°μ²΄λ₯Ό ν€λ‘ νμ©νκ³ `get`, `set`, `has`μ λν΄ νκ· O(1) μκ°μ μ 곡νμ¬ λ§€μ° μ±λ₯μ΄ μ’μ μΊμ± λ©μ»€λμ¦μ λ§λλλ€.
-
μλλ¦¬μ€ 3: λ°μ΄ν°λ² μ΄μ€μ μλ 100λ§ κ°μ κΈ°μ‘΄ μ΄λ©μΌμ λν΄ 10,000κ°μ μλ‘μ΄ μ¬μ©μ μ΄λ©μΌ λ°°μΉ μ ν¨μ± κ²μ¬νκΈ°.
λΆμ: μμ§ν μ κ·Ό λ°©μμ μ μ΄λ©μΌμ λ°λ³΅νλ©΄μ κ° μ΄λ©μΌμ λν΄ κΈ°μ‘΄ μ΄λ©μΌ λ°°μ΄μμ `Array.includes()`λ₯Ό μ¬μ©νλ κ²μ λλ€. μ΄κ²μ O(n*m)μ΄ λμ΄ μΉλͺ μ μΈ μ±λ₯ λ³λͺ© νμμ μΌμΌν¬ κ²μ λλ€. μ¬λ°λ₯Έ μ κ·Ό λ°©μμ λ¨Όμ 100λ§ κ°μ κΈ°μ‘΄ μ΄λ©μΌμ Setμ λ‘λνλ κ²μ λλ€(O(m) μ°μ°). κ·Έλ° λ€μ 10,000κ°μ μ μ΄λ©μΌμ λ°λ³΅νλ©΄μ κ°κ°μ λν΄ `Set.has()`λ₯Ό μ¬μ©ν©λλ€. μ΄ νμΈμ O(1)μ λλ€. μ΄ λ³΅μ‘λλ O(n + m)μ΄ λμ΄ ν¨μ¬ μ°μν©λλ€.
-
μλλ¦¬μ€ 4: μ‘°μ§λ λλ νμΌ μμ€ν
νμκΈ° ꡬμΆνκΈ°.
λΆμ: μ΄ λ°μ΄ν°λ λ³Έμ§μ μΌλ‘ κ³μΈ΅μ μ λλ€. νΈλ¦¬ κ΅¬μ‘°κ° μμ°μ€λ½κ² λ§μ΅λλ€. κ° λ Έλλ μ§μμ΄λ ν΄λλ₯Ό λνλ΄κ³ , κ·Έ μμλ€μ μ§μ λΆν μ§μμ΄λ νμ ν΄λκ° λ κ²μ λλ€. κΉμ΄ μ°μ νμ(DFS)μ΄λ λλΉ μ°μ νμ(BFS)κ³Ό κ°μ μν μκ³ λ¦¬μ¦μ μ¬μ©νμ¬ μ΄ κ³μΈ΅μ ν¨μ¨μ μΌλ‘ νμνκ±°λ νμν μ μμ΅λλ€.
κ²°λ‘ : μ±λ₯μ κΈ°λ₯μ΄λ€
μ±λ₯ μ’μ μλ°μ€ν¬λ¦½νΈλ₯Ό μμ±νλ κ²μ μ£λΆλ₯Έ μ΅μ νλ λͺ¨λ μκ³ λ¦¬μ¦μ μκΈ°νλ κ²μ κ΄ν κ²μ΄ μλλλ€. λ§€μΌ μ¬μ©νλ λꡬμ λν κΉμ μ΄ν΄λ₯Ό λ°μ μν€λ κ²μ λλ€. λ°°μ΄, κ°μ²΄, λ§΅, μ μ μ±λ₯ νΉμ±μ λ΄μ¬ννκ³ , μ°κ²° 리μ€νΈλ νΈλ¦¬μ κ°μ κ³ μ μ μΈ κ΅¬μ‘°κ° λ μ ν©ν λλ₯Ό μμΌλ‘μ¨ λΉμ μ κΈ°μ μ ν λ¨κ³ λμ΄μ¬λ¦΄ μ μμ΅λλ€.
μ¬μ©μλ λΉ μ€ νκΈ°λ²μ΄ 무μμΈμ§ λͺ¨λ₯Ό μ μμ§λ§, κ·Έ ν¨κ³Όλ λλ κ²μ λλ€. κ·Έλ€μ UIμ λΉ λ₯Έ λ°μ, λ°μ΄ν°μ λΉ λ₯Έ λ‘λ©, κ·Έλ¦¬κ³ μ°μνκ² νμ₯λλ μ ν리μΌμ΄μ μ λΆλλ¬μ΄ μλμμ κ·Έκ²μ λλλλ€. μ€λλ μ κ²½μμ μΈ λμ§νΈ νκ²½μμ μ±λ₯μ λ¨μ§ κΈ°μ μ μΈ μΈλΆ μ¬νμ΄ μλλΌ μ€μν κΈ°λ₯μ λλ€. λ°μ΄ν° ꡬ쑰λ₯Ό λ§μ€ν°ν¨μΌλ‘μ¨ λΉμ μ λ¨μ§ μ½λλ₯Ό μ΅μ ννλ κ²μ΄ μλλΌ, μ μΈκ³ μ¬μ©μλ₯Ό μν΄ λ μ’κ³ , λ λΉ λ₯΄λ©°, λ μ λ’°ν μ μλ κ²½νμ ꡬμΆνλ κ²μ λλ€.