코딩 공부 연습

백준 16165 - 걸그룹 마스터 준석이

miffy짱 2022. 10. 10. 14:43
반응형

문제 이름이 이상해서 풀기 싫었는데 풀었다!
set, map을 활용하는 문제였는데, 더 좋은 풀이가 있을 것 같다.
우선 사람 이름을 통해 그룹을 찾는 경우는 그냥 하나의 map에 <이름-그룹명> 으로 짝지은 쌍을 다 집어넣어서 find를 통해 바로 그룹명을 찾아냈다.
반대로 그룹명을 주고 그 그룹에 속한 사람들 이름을 다 찍어내야 하는 경우에는

map <string, set<string>>

이렇게 선언하여 '블랙핑크' 그룹에 속해있는 인원 a, b, c, d를 set안에 모두 담았다.

#include <iostream>
#include <vector>
#include <map>
#include <set>

using namespace std;

int main()
{
    int n, m;
    map <string, string> names;
    map <string, set<string>> groups;

    cin >> n >> m;
    for(int i = 0; i< n; i++)
    {
        string g_name;
        string tmp;
        set <string> tmp_set;
        int g_nums;
        cin>>g_name;
        cin>>g_nums;
        for(int j =0; j< g_nums; j++)
        {
            cin>>tmp;
            names.insert({tmp, g_name});
            tmp_set.insert(tmp);
        }
        groups.insert({g_name,tmp_set});
    }
    for(int i = 0; i< m; i++)
    {
        string q;
        int o_z;
        cin>> q;
        cin>>o_z;
        if (o_z == 1)
        {
            auto found = names.find(q);
            cout<<found->second<<'\n';
        }
        else if (o_z == 0)
        {
            set<string> found = groups.find(q)->second;
            for(auto iter = found.begin(); iter != found.end(); iter++)
                cout<<*iter<<'\n';
        }
    }
    return 0;
}

map에 set을 value로 집어넣는게 문법이 아직도 익숙치 않아서 쫌 걸렸는데, set 을 이용했기 때문에 자동으로 사전순으로 저장이 되었기 때문에 바로 문제를 해결할 수 있었다!!!