//const [n...arr] = require('fs').readFileSync('입력.txt').toString().trim().split('\r\n');
let input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');
let idx = 0;
let tc = +input[idx++];
for (let i = 0; i < tc; i++) {
let n = +input[idx++];
let ans = 1;
let map = new Map();
for (let j = 0; j < n; j++) {
let [name, category] = input[idx++].split(' ');
if (map.get(category) != undefined) map.get(category).push(name);
else map.set(category, [name]);
}
for (let category of map.keys()) {
ans *= (map.get(category).length + 1);
}
console.log(ans - 1);
}
카테고리 별로 map에 담아주었다.
이어서 각 카테고리별 길이를 통해 전체 경우의 수를 구해주었다.
여기서 경우의 수는 소인수분해 후 약수 개수를 구하는 방법을 생각하고 풀었다.
ex)
12 = 2^2 * 3 => 약수 개수는 (2+1)x(1+1) = 6개
다만 이 문제에서는 아무것도 고르지 않는 경우는 없으므로
최종 결과에서 1을 빼주었다.