Divide Players Into Teams of Equal Skill
MediumArrayHash TableTwo PointersSorting
Solution
Solution2: Sort
function dividePlayers(skill: number[]): number {
skill.sort((a, b) => a - b);
const n = skill.length;
const targetSkill = skill[0] + skill[n - 1];
let answer = skill[0] * skill[n - 1];
for (let i = 1; i < n / 2; i++) {
if (skill[i] + skill[n - i - 1] !== targetSkill) {
return -1;
}
answer += skill[i] * skill[n - i - 1];
}
return answer;
}
Complexity
- Time:
O(NlogN)
- Space:
O(S)
- 정렬 알고리즘에 따른 공간복잡도
Solution1: Map
export function dividePlayers(skill: number[]): number {
const n = skill.length;
const totalSkill = skill.reduce((acc, s) => acc + s, 0);
if (totalSkill % (n / 2) !== 0) {
return -1;
}
const counter = new Map<number, number>();
for (const s of skill) {
counter.set(s, (counter.get(s) ?? 0) + 1);
}
let answer = 0;
const targetSkill = totalSkill / (n / 2);
for (const [playerSkill, playerCount] of counter) {
const partnerSkill = targetSkill - playerSkill;
const partnerCount = counter.get(partnerSkill) ?? 0;
if (playerCount !== partnerCount) {
return -1;
}
answer += playerSkill * partnerSkill * playerCount;
}
return answer / 2;
}
Complexity
- Time:
O(N)
- Space:
O(N)