문제
해빈이는 패션에 매우 민감해서 한번 입었던 옷들의 조합을 절대 다시 입지 않는다. 예를 들어 오늘 해빈이가 안경, 코트, 상의, 신발을 입었다면, 다음날은 바지를 추가로 입거나 안경대신 렌즈를 착용하거나 해야한다. 해빈이가 가진 의상들이 주어졌을때 과연 해빈이는 알몸이 아닌 상태로 며칠동안 밖에 돌아다닐 수 있을까?
입력
첫째 줄에 테스트 케이스가 주어진다. 테스트 케이스는 최대 100이다.
- 각 테스트 케이스의 첫째 줄에는 해빈이가 가진 의상의 수 n(0 ≤ n ≤ 30)이 주어진다.
- 다음 n개에는 해빈이가 가진 의상의 이름과 의상의 종류가 공백으로 구분되어 주어진다. 같은 종류의 의상은 하나만 입을 수 있다.
모든 문자열은 1이상 20이하의 알파벳 소문자로 이루어져있으며 같은 이름을 가진 의상은 존재하지 않는다.
출력
각 테스트 케이스에 대해 해빈이가 알몸이 아닌 상태로 의상을 입을 수 있는 경우를 출력하시오.
예제 입력 1 복사
2
3
hat headgear
sunglasses eyewear
turban headgear
3
mask face
sunglasses face
makeup face
예제 출력 1 복사
5
3
• 풀이
처음에 장비이름, 부위를 pair로 하는 벡터로 부분집합을 구한 후 해당 부분집합의 조합을 구해서
해당 조합에서 가능한 경우의 수를 받아보려는데 당연하게도 시간복잡도가 박살났고..
경우의 수 문제라는 걸 알게되었다!
예제 첫번재 경우에는 머리 2개, 눈 1개로 총 3개가 들어왔는데
가능한 경우에 수는 머리 2개 각각에 안입는 경우로 머리 3개
눈은 쓰거나 안쓰는 경우 2개
둘이 곱하면 6개인데 알몸인 경우 1개를 빼서 5개가 된다
예제 두번째 경우에는 같은부위 3개이니 3개가 되고
코드로 구현하기 위해 이름, 타입을 받을때 이름 부분은 버리고 각 타입별로 몇개가 들어왔는지를
<string, int> 로 키값을 받는 맵에 저장, 맵 순회하면서 원소+1 갯수만큼 곱해주고 나온 값을 -1 해줘서 구했다
맵에 타입별 갯수 구할때 굉장히 비효율적으로 해서 그냥 map[type]++ 하면 갯수 구해지는거였다...
#include <bits/stdc++.h>
#include <iostream>
using namespace std;
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int cnt;
cin >> cnt;
while (cnt -- > 0){
int n;
cin >> n;
map<string, int> mmap;
for (int i = 0; i < n; i++) {
//이름은 버리고 타입 갯수만 받아서 타입별 갯수 +1 끼리 곱한 후 알몸인 경우 빼기
string name, type;
cin >> name >> type;
//해당 타입이 있으면 갯수 증가
if (mmap.find(type) != mmap.end()){
mmap[type]++;
}
//해당 타입이 없으면 맵에 삽입하기
else mmap[type] = 1;
}
int res = 1;
for (auto i = mmap.begin(); i != mmap.end(); i++) {
res *= (i->second + 1);
}
//알몸인 경우 빼기
res--;
cout << res << '\n';
}
return 0;
}
'C++ 알고리즘' 카테고리의 다른 글
백준 3986 (스택) (0) | 2024.09.23 |
---|---|
팰린드롬 만들기(구현?) (1) | 2024.09.22 |
백준 1620 (map) (1) | 2024.09.21 |
백준 9996 한국이 그리울 땐 서버에 접속하지 (문자열) (7) | 2024.09.02 |
백준 11655 : ROT13 (1) | 2024.08.28 |