혼자 놀기의 달인

Lv. 2

Solution

export function playAlone(cards: number[]): number {
  const n = cards.length;
  const parents = new Array(n + 1).fill(undefined).map((_, i) => i);
 
  function find(a: number): number {
    if (parents[a] === a) {
      return parents[a];
    }
    return (parents[a] = find(parents[a]));
  }
 
  function union(a: number, b: number): void {
    const parentA = find(a);
    const parentB = find(b);
    if (parentA <= parentB) {
      parents[parentB] = parentA;
    } else {
      parents[parentA] = parentB;
    }
  }
 
  cards.forEach((card) => {
    union(card, cards[card - 1]);
  });
 
  const counter = new Map<number, number>();
  cards.forEach((card) => {
    const parent = find(card);
    counter.set(parent, (counter.get(parent) ?? 0) + 1);
  });
 
  const [first, second] = [...counter.values()].sort((a, b) => b - a);
  return !second ? 0 : first * second;
}