map 컨테이너의 새로운 사용방법과 find함수의 활용, 반복자 활용을 연습해본 좋은 문제였다. 여러번 복습해 보겠다.
아쉬운 점은 변수명을 너무 비슷하게 주는 바람에 나중에는 스스로 헷갈렸다. 변수규칙을 개인적으로 더 확실하게 잡겠다.
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;
//map의 새로운 사용법
void input_member(map <string, vector<string>> &group_member, vector<pair<int, string>> &question)
{
int N, M;
int i, member_num, j;
string group_name;
string member_name;
int question_type;
string question_str;
cin >> N >> M;
//그룹정보 저장
for (i = 0; i < N; i++)
{
cin >> group_name;
cin >> member_num;
for (j = 0; j < member_num; j++)
{
cin >> member_name;
group_member[group_name].push_back(member_name);
//기본적으로는 입력 순으로 저장됨... 출력때는 알파벳순으로 정렬해야함
}
//저장된 벡터 정렬
sort(group_member[group_name].begin(), group_member[group_name].end());
}
//문제 입력
for (i = 0; i < M; i++)
{
cin >> question_str;
cin >> question_type;
question.push_back({ question_type, question_str });
}
/*
cout << "\n\n";
for (auto group : group_member)
{
cout << group.first << "\n";
for (auto member : group.second)
{
cout << member << " ";
}
cout << "\n";
}
*/
return;
}
void find_answer(map <string, vector<string>>& group_member, vector<pair<int, string>>& question)
{
int i;
int j, k;
string group_name, member_name;
for (i = 0; i < question.size(); i++)
{
if (question[i].first == 0)//그룹의 전체 멤버 이름 출력
{
group_name = question[i].second;
for (auto member : group_member[group_name])
{
cout << member << "\n";
}
}
else//1 //멤버가 속한 그룹명 출력
{
member_name = question[i].second;
for (auto groupname : group_member)
{
auto member_vector = groupname.second;
auto find_name = find(member_vector.begin(), member_vector.end(), member_name);
if (find_name != member_vector.end())//벡터 속에서 찾음
{
cout << groupname.first << "\n";
break;
}
}
}
}
return;
}
int main(void)
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
//메모리제한 주의?
map <string, vector<string>> group_member;
vector<pair<int, string>> question;
input_member(group_member, question);
find_answer(group_member, question);
return 0;
}