3. μκ° λ³΅μ‘λ (Time Complexity) Codility Lesson νκ΅μ΄ μ 리본 (JavaScript ver.)
μκ° λ³΅μ‘λλ?
μκ° λ³΅μ‘λ(Time Complexity)λ₯Ό μ¬μ©νλ©΄ νλ‘κ·Έλ¨μ μ€ν μκ°μ λλ΅μ μΌλ‘ μΆμ ν μ μλ€. μ νν μ€ν μκ°μ κ³μ°νλ κ²μ μ»΄νμΌλ¬, μ»΄ν¨ν°μ μ’ λ₯, νλ‘μΈμ μλ λ± μ¬λ¬ μμΈμ μν΄ μν₯μ λ°κΈ° λλ¬Έμ λ§€μ° λ³΅μ‘νλ€. λ°λΌμ, μ°λ¦¬λ μ€ν μκ°μ λλ΅μ μΈ ν¬κΈ°(order of magnitude) λ₯Ό μΈ‘μ νλ κ²μ΄ λͺ©νμ΄λ€.
볡μ‘λλ νλ‘κ·Έλ¨μ΄ μ€νν μ μλ κΈ°λ³Έ μ°μ°(primitive operation) μ μ΅λ κ°μλ‘ λ³Ό μ μλ€. μ¬κΈ°μ κΈ°λ³Έ μ°μ°μ΄λ λ§μ , κ³±μ , λμ μ°μ° λ±μ μλ―Ένλ€. νμ§λ§ λͺ¨λ μ°μ°μ λ€ κ³ λ €νλ λμ , νλ‘κ·Έλ¨μμ κ°μ₯ λ§μ΄ μ€νλλ μ§λ°°μ μΈ μ°μ°(dominant operation) μ μ΄μ μ λ§μΆλ€.
νλ‘κ·Έλ¨μ μκ° λ³΅μ‘λλ μ λ ₯ λ°μ΄ν°μ λ°λΌ λ¬λΌμ§λ©°, λ³΄ν΅ μ λ ₯ λ°μ΄ν°μ ν¬κΈ°μ μν΄ κ²°μ λλ€. μλ₯Ό λ€μ΄, μ λ ₯μ΄ π κ°μ μμλ₯Ό κ°μ§ λ°°μ΄μ΄λΌλ©΄, νλ‘κ·Έλ¨μ μ€ν μκ°μ πμ μν΄ μ’μ°λ κ²μ΄λ€.
1. μ§λ°°μ μΈ μ°μ°κ³Ό μκ° λ³΅μ‘λ
λ€μ μμ λ₯Ό μ΄ν΄λ³΄μ.
μμ : O(n) (μ ν μκ° λ³΅μ‘λ)
function dominant(n) {
let result = 0;
for (let i = 0; i < n; i++) {
result += 1;
}
return result;
}
μ μ½λμμ result += 1; μ°μ°μ΄ n λ² μ€νλλ€. λ°λΌμ μ΄ ν¨μμ μκ° λ³΅μ‘λλ O(n) (μ ν μκ°)μ΄λ€.
μκ° λ³΅μ‘λλ₯Ό λνλ΄λ Big-O νκΈ°λ²μμ μμ κ³μ(constant factor) λ 무μλλ€. μ¦, 루νκ° 20 * n λ² μ€νλλ , n / 5 λ² μ€νλλ , μκ° λ³΅μ‘λλ μ¬μ ν O(n)μΌλ‘ λ³Έλ€.
2. λ€μν μκ° λ³΅μ‘λ λΉκ΅
O(1) (μμ μκ° λ³΅μ‘λ)
function constant(n) {
return n * n;
}
μ΄ ν¨μλ νμ μΌμ ν μμ μ°μ°μ μννλ―λ‘ O(1) (μμ μκ°)μ΄λ€.
O(log n) (λ‘κ·Έ μκ° λ³΅μ‘λ)
function logarithmic(n) {
let result = 0;
while (n > 1) {
n = Math.floor(n / 2);
result += 1;
}
return result;
}
μ΄ ν¨μλ nμ λ°λ³΅μ μΌλ‘ 2λ‘ λλλ―λ‘ O(log n) (λ‘κ·Έ μκ°)μ΄λ€.
O(n) (μ ν μκ° λ³΅μ‘λ)
function linear(n, A) {
for (let i = 0; i < n; i++) {
if (A[i] === 0) return 0;
}
return 1;
}
μ΅μ μ κ²½μ° n λ² λ£¨νλ₯Ό μ€ννλ―λ‘ O(n) (μ ν μκ°)μ΄λ€.
O(n²) (μ΄μ°¨ μκ° λ³΅μ‘λ)
function quadratic(n) {
let result = 0;
for (let i = 0; i < n; i++) {
for (let j = i; j < n; j++) {
result += 1;
}
}
return result;
}
μ΄μ€ 루νλ₯Ό μ¬μ©νμ¬ O(n²) (μ΄μ°¨ μκ°) 볡μ‘λλ₯Ό κ°λλ€.
O(n + m) (λ€μ€ μ ν μκ° λ³΅μ‘λ)
function linear2(n, m) {
let result = 0;
for (let i = 0; i < n; i++) {
result += i;
}
for (let j = 0; j < m; j++) {
result += j;
}
return result;
}
μ¬κΈ°μλ nκ³Ό mμ λ°λΌ λ 립μ μΈ λ κ°μ 루νκ° μ€νλλ―λ‘ O(n + m) μ΄λ€.
O(2βΏ) (μ§μ μκ° λ³΅μ‘λ) λ° O(n!) (ν©ν λ¦¬μΌ μκ° λ³΅μ‘λ)
μ§μ μκ°κ³Ό ν©ν λ¦¬μΌ μκ° λ³΅μ‘λλ₯Ό κ°μ§λ μκ³ λ¦¬μ¦μ μ λ ₯ ν¬κΈ°κ° μ‘°κΈλ§ μ»€μ Έλ μ€ν μκ°μ΄ κΈκ²©ν μ¦κ°νλ―λ‘, μΌλ°μ μΌλ‘ μ¬μ©λμ§ μλλ€.
3. μκ° μ νκ³Ό μμ 볡μ‘λ
μΌλ°μ μΌλ‘ νκ· μ μΈ μ»΄ν¨ν°λ 1μ΄ μμ μ½ 10βΈ κ°μ μ°μ°μ μνν μ μλ€. λ°λΌμ μ λ ₯ ν¬κΈ°(π)μ λ°λ₯Έ μμ 볡μ‘λλ₯Ό λ€μκ³Ό κ°μ΄ μ μΆν μ μλ€.
- π ≈ 1,000,000 → O(n) λλ O(n log n)
- π ≈ 10,000 → O(n²)
- π ≈ 500 → O(n³)
μ΄λ λλ΅μ μΈ κΈ°μ€μ΄λ©°, νΉμ λ¬Έμ μ λ°λΌ λ€λ₯Ό μ μλ€.
4. κ³΅κ° λ³΅μ‘λ (Space Complexity)
κ³΅κ° λ³΅μ‘λλ νλ‘κ·Έλ¨μ΄ μ€νλ λ νμν λ©λͺ¨λ¦¬ ν¬κΈ°λ₯Ό μλ―Ένλ€.
- O(1) (μμ 곡κ°): κ³ μ λ κ°μμ λ³μλ§ μ¬μ©ν λ
- O(n) (μ ν 곡κ°): μ λ ₯ ν¬κΈ° π μ λΉλ‘νλ λ°°μ΄μ μ¬μ©ν λ
- O(n²) (μ΄μ°¨ 곡κ°): π×π ν¬κΈ°μ 2μ°¨μ λ°°μ΄μ μ¬μ©ν λ
νΉν μ¬κ·(Recursion) λ₯Ό μ¬μ©ν κ²½μ°, μ€ν λ©λͺ¨λ¦¬κ° μΆκ°μ μΌλ‘ νμνκΈ° λλ¬Έμ κ³΅κ° λ³΅μ‘λλ₯Ό μ μ€ν κ³ λ €ν΄μΌ νλ€.
5. μκ° λ³΅μ‘λ κ³μ° μμ
λ¬Έμ : 1λΆν° πκΉμ§μ ν© κ³μ°νκΈ°
O(n²) (λΉν¨μ¨μ μΈ λ°©λ²)
function slowSum(n) {
let result = 0;
for (let i = 0; i < n; i++) {
for (let j = 0; j <= i; j++) {
result += 1;
}
}
return result;
}
O(n) (μ ν μκ°)
function fastSum(n) {
let result = 0;
for (let i = 1; i <= n; i++) {
result += i;
}
return result;
}
O(1) (μμ μκ°, μ΅μ νλ λ°©λ²)
function optimizedSum(n) {
return (n * (n + 1)) / 2;
}
μ΄ λ°©λ²μ λ¨ νλμ μ°μ°λ§ νμνλ―λ‘ O(1) (μμ μκ°)μ΄λ€.