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)