나도 공부한다/알고리즘

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

꾸빵이 2023. 5. 8. 01:44

Idea

처음엔 아래 코처럼 map을 이용하여 key엔 그룹명, value엔 멤버 이름을 넣어서 1이 입력되면 find를 이용하여 해당 그룹명을 출력하고 0이 들어오면 count로 키를 찾아서 해당 키에 대한 value를 출력하는 방식을 선택했다.

 

그런데 두가지 문제가 있었다.

 

1. 1이 입력됐을 때 멤버 이름으로 그룹명을 찾을 마땅한 방법이 없다. 사실상 value값으로 key값을 찾아내야하는건데 구글링하다가 생각보다 복잡해서 포기했다...

 

2. 멤버 이름이 사전 순으로 정렬되지 않는다. map은 key를 기준으로 정렬되기 때문이다. value를 기준으로 정렬하고 싶으면 map을 벡터로 옮기고 벡터를 정렬시켜서 출력할 때도 벡터를 사용해야한다. 이렇게 하면 map의 장점이 모두 쓸모없어지므로 나는 value를 기준으로 정렬해야하는 상황에선 굳이 map을 사용하지 않는다. 2차원 벡터를 사용하는게 더 편하다. 하지만 이 문제는 맵에 최적화된 문제라고 생각하기 때문에 맵을 사용하고 싶었다. 그래서 멤버 이름을 벡터에 넣은 후 sort를 이용하여 정렬하고 정렬된 벡터를 역으로 맵에 넣어주는 방법을 선택했다.

 

Code

#include <iostream>
#include <map>
#include <string>
#include <vector>
using namespace std;

int main() {

	int n = 0, m = 0;
	string group="";
	string member = "";
	int memNum = 0;
	string quest = "";
	int questNum = 0;

	map<string, vector<string>>mp;

	cin >> n >> m;

	for (int i = 0; i < n; i++) {
		cin >> group;
		cin >> memNum;

		for (int j = 0; j < memNum; j++) {
			cin >> member;
			mp[group].push_back(member);
		}
	}

	for (int i = 0; i < m; i++) {
		cin >> quest >> questNum;
		if (questNum == 1) {
			if (mp.find(quest) != mp.end()) {
				cout << "그룹명" << endl;
			}
		} // 멤버 이름 입력하면 그룹명 찾기
		else {
			if (mp.count(quest)==1) {
				for (auto a : mp[quest]) cout << a << endl;
			}
		} // 그룹명 입력하면 멤버 이름 찾기
	}

	return 0;
}