import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
// testCase
int testCase = Integer.parseInt(br.readLine());
for(int i=0;i<testCase;i++) {
// 의상 개수
int n = Integer.parseInt(br.readLine());
bw.write(getEnableDay(n, br)+"\n");
}
bw.flush();
br.close();
bw.close();
}
// 의상 개수와 종류에 따라 옷 입을 수 있는 날짜
public static Integer getEnableDay(int n, BufferedReader br) throws Exception {
// 의상의 종류별 개수 파악
HashMap<String, Integer> map = new HashMap<>();
for(int i=0;i<n;i++) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
st.nextToken();
String type = st.nextToken();
map.put(type, map.getOrDefault(type, 0)+1);
}
int answer = 1;
for(String c : map.keySet()) {
// 종류별로 하나씩 택해서 입는 경우 & 아예 안 입는 경우(+1)
answer = answer * (map.get(c)+1);
}
// 모든 걸 안 입는 경우 제외
answer = answer -1;
return answer;
}
}
- map.put(type, map.getOrDefault(type, 0)+1) 이 코드는 key가 존재하지 않으면 초기값을 0을 넣고 거기에 +1해서 key의 개수 셀 때 많이 나오는 거임 꼭꼭 잊지 말기
- 입력처리는 보통 main에서 한다 br 함수에 넘기지 말고 main에서 하려무나
- Integer getEnableDay 함수 선언 이케 하지 말아 int로 쓰는게 맞다. Integer는 객체임
- StringTokenizer st = new StringTokenizer(br.readLine(), " "); 반복문 안에 생성자로 계속 만들어도 괜춘 무관하다~~