[BOJ] 9375번: 패션왕 신해빈
https://www.acmicpc.net/problem/9375
9375번: 패션왕 신해빈
첫 번째 테스트 케이스는 headgear에 해당하는 의상이 hat, turban이며 eyewear에 해당하는 의상이 sunglasses이므로 (hat), (turban), (sunglasses), (hat,sunglasses), (turban,sunglasses)로 총 5가지 이다.
www.acmicpc.net
문제
해빈이는 패션에 매우 민감해서 한번 입었던 옷들의 조합을 절대 다시 입지 않는다. 예를 들어 오늘 해빈이가 안경, 코트, 상의, 신발을 입었다면, 다음날은 바지를 추가로 입거나 안경 대신 렌즈를 착용하거나 해야 한다. 해빈이가 가진 의상들이 주어졌을 때 과연 해빈이는 알몸이 아닌 상태로 며칠 동안 밖에 돌아다닐 수 있을까?
입력
첫째 줄에 테스트 케이스가 주어진다. 테스트 케이스는 최대 100이다.
- 각 테스트 케이스의 첫째 줄에는 해빈이가 가진 의상의 수 n(0 ≤ n ≤ 30)이 주어진다.
- 다음 n개에는 해빈이가 가진 의상의 이름과 의상의 종류가 공백으로 구분되어 주어진다. 같은 종류의 의상은 하나만 입을 수 있다.
모든 문자열은 1 이상 20 이하의 알파벳 소문자로 이루어져 있으며 같은 이름을 가진 의상은 존재하지 않는다.
출력
각 테스트 케이스에 대해 해빈이가 알몸이 아닌 상태로 의상을 입을 수 있는 경우를 출력하시오.
풀이
📚 map <key, value>
map은 key와 value를 pair 형태로 선언한다.
key에 입력받은 옷의 종류를 입력하고 value에 그 옷의 종류의 개수를 입력한다.
· find(key) : key 값에 해당하는 iterator return
· insert(make_pair(key, value)) : 맵에 원소 추가
find 함수를 이용하여 이미 있는 옷의 종류인지 확인하고 이미 있을 경우 그 값의 value에 +1 해준다.
없을 경우 key에 옷의 종류를, value에 1을 입력하여 insert 함수로 map에 추가한다.
경우의 수
이 문제는 경우의 수를 생각하는 것이 중요하다.
같은 종류의 의상은 하나만 입을 수 있으므로 옷의 종류 개수 n에 그중 아무것도 선택하지 않은 경우를 추가한다. 따라서 하나의 옷 종류를 선택할 수 있는 경우의 수는 n+1이다. 각각의 옷 종류의 개수에 1을 더해서 곱해주면 된다.
이때, 옷의 종류는 하나 이상은 선택해야 하므로 아무것도 선택하지 않은 경우 1가지를 빼주어야 한다.
ex) headgear 2가지, face 2가지 있을 경우
headgear를 선택하는 경우의 수는 아무것도 선택 안 하거나, 1번 또는 2번을 선택하는 3가지
face를 선택하는 경우의 수는 아무것도 선택 안 하거나, 1번 또는 2번을 선택하는 3가지
headgear 선택하는 경우의 수 X face 선택하는 경우의 수 = 3 * 3 = 9가지
headgear | eyewear |
1번 선택 | 아무것도 선택 X |
1번 선택 | 1번 선택 |
1번 선택 | 2번 선택 |
2번 선택 | 아무것도 선택 X |
2번 선택 | 1번 선택 |
2번 선택 | 2번 선택 |
아무것도 선택 X | 1번 선택 |
아무것도 선택 X | 2번 선택 |
아무것도 선택 X | 아무것도 선택 X |
headgear와 eyewear 모두 아무것도 선택하지 않는 경우를 빼주면 8가지
코드
#include <iostream>
#include <map>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int m, n;
string s1, s2;
cin >> m;
for(int i = 0; i < m; i++) {
cin >> n;
map<string,int> wear;
for(int j = 0; j < n; j++) {
cin >> s1 >> s2;
if(wear.find(s2) == wear.end()) {
wear.insert({s2, 1});
}
else wear[s2]++;
}
int cnt = 1;
for(auto iter:wear) {
cnt *= (iter.second+1);
}
cout << cnt-1 << "\n";
}
}