#include <bits/stdc++.h>
using namespace std;
int t, n;
string a, b;
int main(){
cin >> t;
while(t--){
map <string, int> map1;
cin >> n;
for(int i =0; i < n; i++){
cin >> a >> b;
map1[b]++;
}
long long ret = 1;
for(auto k : map1){
ret *= ((long long) k.second+1);
}
ret--;
cout << ret << '\n';
}
return 0;
}
입력 값 형식이 string, string이라 map을 <string, string> 구조로 하려고 생각을 시작했다.
한참을 생각해보니 이게 도저히 string 형식이면 같은 옷 종류에 담는다 쳤을때 갯수도 따로 세줘야하고 몇 개씩 뽑는다라는 로직도 새로 만들어야해서 아니라는 생각이 들었다.
그래서 생각한게 종류만 신경쓰면 뭘 뽑든 상관없다. 였다. 얼굴에 필요한 어떠한 것만 뽑으면 되지 뭐가 나오는건 신경쓸게 아니라 생각했다.
확률적인 문제인데 옷이 3종류, 바지가 4종류면 옷에서 고를 수 있는 경우의 수는
4(안입는거, 1, 2, 3) 바지에서 고를 수 있는 경우의 수는 5 (안입는거, 1, 2, 3, 4)이다.
즉, <종류, 갯수>의 형식으로 map을 구성해서 곱셈을 하면 훨씬 간단하게 접근이 가능한 문제였다.
주의할 점은 안입는 경우도 생각해야 한다는 점 + 알몸은 되지 않는 다는 점이기에 전체에서 알몸인 경우 1가지만 빼주면 된다.
솔직히 이제와서야 쉽게 설명하는데 저런 생각을 하는게 너무 오래 걸린데다가 인터넷에서 힌트를 보고 얻었다. 어떤 문제는 이렇게 수식 몇개를 표현하기만 하면 풀리는데 어떤 문제는 자료구조적인 생각으로 접근해야 풀려서 그 어딘가를 찾아내는게 정말 어려운 것 같다. 꾸준히 연습해야겠다..ㅜ