본문 바로가기

온라인 코딩/기타(Other)

[백준] 16165번 걸그룹 마스터 준석이

 

 

문제

소스코드

#include<iostream>
#include<map>
#include<string>
#include<vector>
#include<algorithm>

constexpr int TOTAL_GROUP    = 100;
constexpr int TOTAL_PROBLEM  = 100;

using groups_pair = std::pair < std::string, std::vector<std::string>>;
using members_pair = std::pair < std::string, std::string>;

std::map<std::string, std::vector<std::string>>  g_members;
std::map<std::string, std::string>               g_groups;
std::vector<std::string>                         g_solution;


// map에 걸그룹 정보를 넣는다.
void InsertGroupInfor() {
	int total_member{};
	std::string group_name{};
	std::string member_name{};
	std::vector<std::string>group_members;

	std::cin >> group_name;
	std::cin >> total_member;

	for (int i = 0; i < total_member; ++i) {
		std::cin >> member_name;
		group_members.emplace_back(member_name);
		//해당 멤버의 그룹 정보를 넣는다.
		g_groups.emplace(members_pair{ member_name,group_name });  
	}
	//해당 그룹의 멤버들의 정보를 넣는다.
	g_members.emplace(groups_pair(group_name, group_members));

}

// map에 있는 정보를 토대로 값을 찾는다.
void ProcessProblumes() {
	int select{};  
	std::string name{};
	std::cin >> name;
	std::cin >> select;

	//0-> DisPlay All member 
	if (select == 0) {
		auto iter = g_members.find(name)->second;
		std::sort(iter.begin(), iter.end(), [](const auto& lhs, const auto& rhs) {return lhs < rhs; });
		std::copy(iter.begin(), iter.end(), std::back_inserter(g_solution));
	}
	// 1-> DisPlay Team
	else {
		auto iter = g_groups.find(name)->second;
		g_solution.emplace_back(iter);
	}

}

int main() {
	int N{}, M{};
	std::cin >> N >> M;

	for (int i = 0; i < N; ++i)
		InsertGroupInfor();

	for (int i = 0; i < M; ++i)
		ProcessProblumes();

	for (const auto& i : g_solution)
		std::cout << i << "\n";
}

 

이 문제를 해결하기 위한 키워드는 2가지이다.

 

1. 걸그룹 팀명에 따른 멤버들을 넣거나, 멤버에 대한 팀명을 넣어야 한다.

     InsertGroupInfor() 메서드에 해당 내용을 구현하였다.

     이 문제는 두개의 map을 사용해서 문제를 풀었는데

     팀 이름을 입력했을 때에 해당 팀에 멤버들을 넣을 수 있는 g_members와

      멤버 이름을 입력했을 때 해당 멤버가 속한 그룹 명을 넣을 수 있는 g_groups를 만들었다.

 

2. 퀴즈에 대한 정보 값을 출력한다.

      ProcessProblumes() 메서드에 해당 내용을 구현하였으며  모든 입력값에 따른 출력을 나중에 진행해야 하기 때문에

     출력용 Vector인 g_solution을 사용하였다.

     0이 입력되면  g_groups에 name을 key로 하여 해당 멤버의 팀 정보를  g_solution에 넣었다.

     1이 입력되면 g_members에 name을 key로 하여 정렬 후 해당 그룹의 멤버 정보를 std::copy()로 g_solution에

     복사하였다.

  

 

 

 

출처 및 레퍼런스

문제 링크:https://www.acmicpc.net/problem/16165