: 생각을 더 못해서 틀림.
#include <iostream>
using namespace std;
#include <string>
#include <vector>
#include <limits.h>
#include <algorithm>
#include <map>
#include <future>
#include <thread>
#include <numeric>
#include <stack>
#include <queue>
#include <memory>
#include <set>
#include <string>
#include <stack>
#include <mutex>
#include <ostream>
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
// 한 번 입었던 옷의 조합은 절대 입지 않음.
int testCnt;
cin >> testCnt;
int n;
for (int i = 0; i < testCnt; ++i)
{
cin >> n;
// 의상의 이름과 의상의 종류가 공백으로 구분되면서 입력
// 같은 이름을 가진 의상은 없음.
// 알몸이 아닌 상태로 의상을 입는 경우의 수
map<string, int> clothes;
for (int j = 0; j < n; ++j)
{
// 전체 헤드기어 수 + 전체 아이웨어 수
// + 2 * 1
// 한가지만 입을 경우 : 각 종류의 사이즈만 큼 합 누적
// 조합 만드는 경우는 곱하기 처리 하자.
string s1, s2;
cin >> s1 >> s2;
clothes[s2]++;
}
int sum = 0;
int temp = 0;
for (auto &iter : clothes)
{
// 조합 처리하는 방법을 어떻게 계산할까?
sum += iter.second;
temp++;
}
int johap = 1;
if (temp >= 2)
{
for (auto &iter : clothes)
{
johap *= iter.second;
}
}
else
{
johap = 0;
}
cout << sum + johap << endl;
// f1 ,f2, f3 , e1 ,e2 ,e3
// face : 1개 선택 eyebrow 0개 선택 - > 3
// face : 0개 선택 eyebrow 1개 선택 -> 3
// face : 1개 선택 eyebrow 1개 선택 -> 9
}
}
: 알아야 할점.
헤드기어 2개
아이웨어 1개 일 경우 나올 수 있는 경우의 수는?
헤드기어 : a,b
아이웨어 : A
헤드기어 아이웨어 아무것도 선택 안함 / a / b / A / a A / b A 총 6개이다.
이게 나올수 있게 하기 위해서는 각각의 종류에다가 "없음" 을 더해줘야 함.
이렇게 생각하자.
헤드기어 종류 : a,b , 선택안함. -> 총 3개
아이웨어 종류 : A , 선택안함.-> 총 2개
1.헤드기어 선택 안함 , 아이웨어 선택 안함.
2.헤드기어 a , 아이웨어 선택 안함. /
3.헤드기어 b , 아이웨어 선택 안함./
4.헤드기어 선택 안함, 아이웨어 A /
5.헤드기어 a , 아이웨어 A /
6.헤드기어 b , 아이웨어 A /
총 6개이다.
그런데 문제에서 모든 의상 선택 안함은 없애야 한다고 하니까
위의 조건으로 진행한다면 map<string ,int> clothes 이고
2번째 케이스를 진행한다면, second는 3이지만, 아무것도 선택 안함 조건이 추가되므로,
4가 됨.
마지막에 계산할 때 누적 곱셈 처리하는 1 * 4
그리고 -1 처리하면 됨. -> 3
1번 케이스라고 한다면, headgear는 3 이고, eyewear 는 2 이고
누적 곱 진행하면 1 3 2
그리고 -1 처리하면 5