후기

처음에는 몸무게와 거리의 조합을 직접 비교하는 대신, 몸무게 / 거리 값이 같으면 균형을 이루는 짝이라고 생각했었다.

예를 들어 100 / 2와 150 / 3이 모두 50이므로, 두 사람이 시소 짝꿍이라는 것을 같은 값으로 묶어 판별할 수 있었다. 이 아이디어 자체는 맞았었다.

처음 작성한 코드에서는 같은 몸무게가 다시 나오면 Set으로 확인한 뒤 정답에 1만 더하고 넘어가도록 했었다.

하지만 이 방식에는 문제가 있었었다.

같은 몸무게가 세 명이라면 가능한 짝은 단순히 두 개가 아니라 세 개였다.

첫 번째 - 두 번째
첫 번째 - 세 번째
두 번째 - 세 번째

즉, 중복 여부만 확인하는 Set으로는 부족했고, 같은 몸무게가 몇 명 존재하는지를 저장해야 했었다.

그래서 몸무게별 등장 횟수를 dup 객체에 저장하도록 변경했었다.

dup[weight] = (dup[weight] || 0) + 1;

또한 처음에는 같은 몸무게 / 거리 값이 나온 횟수를 그대로 정답에 더했었다.

answer += dic[d];

하지만 dic[d]는 짝의 개수가 아니라 해당 값을 만든 사람의 수였다.

같은 값을 만든 사람이 두 명이면 짝은 한 개이고, 세 명이면 세 개이며, 네 명이면 여섯 개였다.

따라서 사람 수가 count명일 때 가능한 짝의 개수는 조합식으로 계산해야 했었다.

count * (count - 1) / 2

그래서 같은 값을 만든 사람들을 다음과 같이 짝의 개수로 변환했었다.

for (const d in dic) {
    const count = dic[d];
    answer += count * (count - 1) / 2;
}

여기까지 수정했지만 같은 몸무게끼리의 짝이 중복 계산되는 문제가 남아 있었었다.

예를 들어 몸무게가 같은 두 사람은 다음 세 경우에서 모두 같은 값을 만들었다.