๋ฆฌ๋(Leader)๋?
์ฃผ์ด์ง ์์ด A = [aโ, aโ, ..., aโโโ] ์์ ๋ฆฌ๋(Leader) ๋ ์์ด์ ์์ ์ค ์ ๋ฐ์ ์ด๊ณผํ์ฌ ๋ฑ์ฅํ๋ ์์ ๋ฅผ ์๋ฏธํ๋ค.
์๋ฅผ ๋ค์ด, ๋ค์๊ณผ ๊ฐ์ ์์ด์ด ์์ ๋:
A = [6, 8, 4, 6, 8, 6, 6];
์ ์์ด์์ 6์ 4๋ฒ ๋ฑ์ฅํ์ฌ n/2 = 3.5 ๋ณด๋ค ๋ง์ด ๋ฑ์ฅํ๋ฏ๋ก ๋ฆฌ๋๊ฐ ๋๋ค. ๋ฆฌ๋๋ ์ต๋ ํ๋๋ง ์กด์ฌ ํ๋ค.
1. O(n²) ์๊ฐ ๋ณต์ก๋์ ๋จ์ํ ๋ฐฉ๋ฒ
๊ฐ ์์์ ๋ฑ์ฅ ํ์๋ฅผ ์ธ์ด ๋ฆฌ๋๋ฅผ ์ฐพ๋ ๋ฐฉ๋ฒ์ด๋ค.
JavaScript ์ฝ๋:
function slowLeader(A) {
let n = A.length;
let leader = -1;
for (let k = 0; k < n; k++) {
let candidate = A[k];
let count = 0;
for (let i = 0; i < n; i++) {
if (A[i] === candidate) {
count++;
}
}
if (count > Math.floor(n / 2)) {
leader = candidate;
}
}
return leader;
}
์๊ฐ ๋ณต์ก๋: O(n²) (๋ชจ๋ ์์๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ๋น๊ต)
2. O(n log n) ์๊ฐ ๋ณต์ก๋์ ์ ๋ ฌ ๊ธฐ๋ฐ ๋ฐฉ๋ฒ
๋ฐฐ์ด์ ์ ๋ ฌํ๋ฉด ๊ฐ์ ๊ฐ๋ค์ด ์ธ์ ํ๊ฒ ๋ชจ์ด๋ฏ๋ก, ์ค์๊ฐ(A[n/2])์ด ๋ฆฌ๋์ผ ๊ฐ๋ฅ์ฑ์ด ๋๋ค.
JavaScript ์ฝ๋:
function fastLeader(A) {
let n = A.length;
A.sort((a, b) => a - b);
let candidate = A[Math.floor(n / 2)];
let count = A.filter(x => x === candidate).length;
return count > Math.floor(n / 2) ? candidate : -1;
}
์๊ฐ ๋ณต์ก๋: O(n log n) (์ ๋ ฌ ํ ๋จ์ ๋ฐ๋ณต)
3. O(n) ์๊ฐ ๋ณต์ก๋์ ์คํ ๊ธฐ๋ฐ ๋ฐฉ๋ฒ
์์ด๋์ด:
- ์๋ก ๋ค๋ฅธ ๋ ์์๋ฅผ ์ ๊ฑฐํด๋ ๋ฆฌ๋๋ ๋ณํ์ง ์๋๋ค.
- ์คํ์ ํ์ฉํด ์๋ก ๋ค๋ฅธ ์์๋ฅผ ์ ๊ฑฐํ๋ฉด์ ๋จ์ ์์๋ฅผ ๋ฆฌ๋ ํ๋ณด๋ก ์ ํํ๋ค.
- ๋ง์ง๋ง์ผ๋ก ๋ฆฌ๋ ํ๋ณด์ ๋ฑ์ฅ ํ์๋ฅผ ์ธ์ด ์ค์ ๋ฆฌ๋์ธ์ง ํ์ธํ๋ค.
JavaScript ์ฝ๋:
function goldenLeader(A) {
let n = A.length;
let size = 0;
let value;
for (let k = 0; k < n; k++) {
if (size === 0) {
size++;
value = A[k];
} else {
size += (A[k] === value) ? 1 : -1;
}
}
let candidate = -1;
if (size > 0) {
candidate = value;
}
let count = A.filter(x => x === candidate).length;
return count > Math.floor(n / 2) ? candidate : -1;
}
์๊ฐ ๋ณต์ก๋: O(n) (๊ฐ ์์๋ฅผ ํ ๋ฒ์ฉ๋ง ํ์)
๋ฐ์ํ
๋๊ธ