์์ ๊ฐ์ ์ธ๊ธฐ๋?
๋ฐฐ์ด์ ํ์ฉํ์ฌ ์ซ์ ์ํ์ค๋ฅผ ์ ์ฅํ๋ ๋ฐฉ๋ฒ์๋ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ฐ์๋ ์ซ์ 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) ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ฉฐ, ๋ ํฐ ์ ๋ ฅ ๊ฐ์๋ ํจ๊ณผ์ ์ผ๋ก ์คํ๋ ์ ์๋ค.
๋๊ธ