4. μμ κ°μ μΈκΈ° (Counting Elements) Codility Lesson νκ΅μ΄ μ 리본 (JavaScript ver.)
μμ κ°μ μΈκΈ°λ?
λ°°μ΄μ νμ©νμ¬ μ«μ μνμ€λ₯Ό μ μ₯νλ λ°©λ²μλ μ¬λ¬ κ°μ§κ° μλ€. μΌλ°μ μΌλ‘ μ°μλ μ«μ aβ, aβ, ..., aβββλ₯Ό λ°°μ΄μ μΈλ±μ€μ λ§μΆ° μ μ₯νλ€.
μλ₯Ό λ€μ΄:
let A = [4, 2, 4, 5];
// A[0] = 4, A[1] = 2, A[2] = 4, A[3] = 5
κ·Έλ¬λ μμλ₯Ό μ§μ μ μ₯νλ λμ , κ° μ«μμ λ±μ₯ νμλ₯Ό μΈλ λ°°μ΄ μ λ§λ€ μλ μλ€.
μ΄ κ²½μ°, λ°°μ΄ count[] λ ν΄λΉ κ°μ΄ λ±μ₯ν νμλ₯Ό μ μ₯νλ€.
count[2] = 1; // μ«μ 2λ ν λ² λ±μ₯
count[4] = 2; // μ«μ 4λ λ λ² λ±μ₯
count[5] = 1; // μ«μ 5λ ν λ² λ±μ₯
μ΄ λ°©λ²μ μ¬μ©νλ©΄ νΉμ μ«μκ° λ±μ₯ν νμλ₯Ό O(1) μκ°μ νμΈν μ μλ€.
1. O(n + m) μκ° λ³΅μ‘λμ μμ κ°μ μΈκΈ°
λ€μ ν¨μλ λ°°μ΄ Aμ λ±μ₯νλ κ° μ«μμ κ°μλ₯Ό μΈλ ν¨μμ΄λ€.
JavaScript μ½λ:
function counting(A, m) {
let n = A.length;
let count = new Array(m + 1).fill(0);
for (let k = 0; k < n; k++) {
count[A[k]] += 1;
}
return count;
}
μ΄ ν¨μλ O(n + m) μκ° λ³΅μ‘λλ₯Ό κ°μ§λ€. m κ°μ΄ λ무 ν¬λ©΄ λ©λͺ¨λ¦¬ μ¬μ©λμ΄ μ¦κ°ν μ μλ€.
2. λ°°μ΄ κ΅νμ ν΅ν ν© μΌμΉ μ¬λΆ νμΈ
λ°°μ΄ Aμ Bκ° μ£Όμ΄μ‘μ λ, νλμ μμλ₯Ό κ΅ννμ¬ λ λ°°μ΄μ ν©μ λμΌνκ² λ§λ€ μ μλμ§ νμΈνλ λ¬Έμ μ΄λ€.
O(n²) (λΉν¨μ¨μ μΈ λ°©λ²)
function slowSolution(A, B, m) {
let n = A.length;
let sumA = A.reduce((a, b) => a + b, 0);
let sumB = B.reduce((a, b) => a + b, 0);
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
let change = B[j] - A[i];
sumA += change;
sumB -= change;
if (sumA === sumB) return true;
sumA -= change;
sumB += change;
}
}
return false;
}
μ΄ λ°©λ²μ λͺ¨λ κ°λ₯ν μμ κ΅νν΄λ³΄λ―λ‘ O(n²) μκ°μ΄ κ±Έλ¦°λ€.
O(n + m) (ν¨μ¨μ μΈ λ°©λ²)
μ’ λ ν¨μ¨μ μΈ λ°©λ²μ μμ κ°μλ₯Ό μΈλ λ°°μ΄μ νμ©νλ κ²μ΄λ€.
function fastSolution(A, B, m) {
let n = A.length;
let sumA = A.reduce((a, b) => a + b, 0);
let sumB = B.reduce((a, b) => a + b, 0);
let d = sumB - sumA;
if (d % 2 !== 0) return false;
d /= 2;
let count = counting(A, m);
for (let i = 0; i < n; i++) {
if (B[i] - d >= 0 && B[i] - d <= m && count[B[i] - d] > 0) {
return true;
}
}
return false;
}
μ΄ λ°©λ²μ O(n + m) μκ° λ³΅μ‘λλ₯Ό κ°μ§λ©°, λ ν° μ λ ₯ κ°μλ ν¨κ³Όμ μΌλ‘ μ€νλ μ μλ€.