
이 문제는 입력에서 함정이 있는데, 그 함정은 두개 동시 입력중에서 하나는 꼭 저장할 필요가 없다는 점이다. 그렇다면 저장을 해야되는 건 옷 이름이 아닌, 옷의 종류를 저장하고, 그 값을 구해야 하는데, 한번 알고리즘을 짜보자.
알고리즘
- map으로 string과 int의 맵을 생성
- map에 옷의 종류의 value를 +1 하기
- 그리고 map의 각 value값을 +1한 값을 곱하기
- 출력은 -1을 해야됨(알몸일 순 없음)
알고리즘을 한번 짜봤는데, 왜 곱하는지와, +1을 해야되는지도 이해를 못할 수 있을거다. 그 답을 얻기 위해선 경우의 수를 알아야되는데, 예제 입력에서 첫번째 문제 입력을 한번 봐보자.
headgear는 2개 eyewear은 1개, 여기서 아무것도 안입을 수 있으니, 3개 2개다. 그렇다면 이제 이 두개를 곱하면 되는데, 곱하면 6이 나오는걸 알 수 있다. 하지만? 알몸일 수는 없다는 조건이 있어서, -1을 해주면 정답인 5가 나온다.
#include<iostream>
#include<vector>
#include<string>
#include<map>
#include<algorithm>
using namespace std;
int main() {
int n, m;
long long int sum;
cin >> n;
for (int i = 0; i < n; i++) {
// 곱해야 하니 1로 초기화
sum = 1;
// 입력 받은 공간
map<string, int> _map;
cin >> m;
for (int j = 0; j < m; j++) {
string a, b;
cin >> a >> b;
// a b일때 b index의 값 +1
_map[b]++;
}
for (auto c : _map) {
// 경우의 수를 생각해 +1를 하고 곱하기
sum *= ((long long)c.second + 1);
}
// 알몸일 수는 없으니 -1
cout << sum-1 << "\n";
}
}