Notice
Recent Posts
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
관리 메뉴

이우의 개발일지

[백준/C++] 7785번 unorderd_map 활용법 및 sort하는 법 /해시 / 회사에 있는 사람 - (1) 본문

Coding/Algorithm

[백준/C++] 7785번 unorderd_map 활용법 및 sort하는 법 /해시 / 회사에 있는 사람 - (1)

공대이우 2024. 8. 13. 22:41

백준  7785번 회사에 있는 사람

 

이 문제는 unorderd_map을 통해 어느정도 쉽게 구현이 가능한 문제입니다.

 

들어가기에 앞서, 먼저 unorderde_map을 어떻게 활용하냐?

 

void unordered_map_example(){
  unordered_map<string, int> m;
  m["hi"] = 123;
  m["bkd"] = 1000;
  m["gogo"] = 165; // ("hi", 123), ("bkd", 1000), ("gogo", 165)
  cout << m.size() << '\n'; // 3
  m["hi"] = -7;  // ("hi", -7), ("bkd", 1000), ("gogo", 165)
  if(m.find("hi") != m.end()) cout << "hi in m\n";
  else cout << "hi not in m\n";
  m.erase("bkd"); // ("hi", 123), ("gogo", 165)
  for(auto e : m)
    cout << e.first << ' ' << e.second << '\n';
}

 

위 코드를 보면 map에 key와 value 를 대칭해서 넣을 수 있다는 것을 확인할 수 있다. 

그 안에서 find 함수와 erase 함수를 자유롭게 쓸 수 있다는 장점이 있지만, 단점으로는 해당하는 Map값이 순서대로 저장되지는 않는다는점이다.

 

이러한 특성을 가지고 위의 문제를 풀어보았다.

 

	for (int i = 0; i < n; i++) {
		string st1;
		string st2;

		cin >> st1 >> st2;

		m[st1] = st2;
	}

	//sort(m.begin(), m.end(), cmp);

	for (auto e : m) {
		if (e.second == "enter") str.push_back(e.first);
	}

 

먼저, 차례대로 값을 mapping 시켜준 다음 문제의 주어진 조건 중에 enter, 즉 값이 존재하는 경우만을 vector<string> str 변수에 넣어주었다.

 

아까 위에서 unordered_map은 값을 넣어준다고 해서 차례대로 들어가는 것이 아니기때문에 만약 정렬을 해야한다면 이렇게 값을 따로 빼서 다른 변수에 넣어주는 것이 좋다. 

 

	sort(str.begin(), str.end(),cmp);

	for (int i = 0; i < str.size(); i++) {
		cout << str[i] << '\n';
	}

 

그런 다음, 이렇게 sort를 해서 원하는 조건에 맞춰 정렬을 해주고, 출력을 해주면 끝!

 

7785 회사에 있는 사람 전체 코드

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

using namespace std;

unordered_map<string, string> m;
vector<string> str;

bool cmp(string & a, string & b) {
	return a > b;
}

int main() {
	int n;
	cin >> n;
	for (int i = 0; i < n; i++) {
		string st1;
		string st2;

		cin >> st1 >> st2;

		m[st1] = st2;
	}

	//sort(m.begin(), m.end(), cmp);

	for (auto e : m) {
		if (e.second == "enter") str.push_back(e.first);
	}

	sort(str.begin(), str.end(),cmp);

	for (int i = 0; i < str.size(); i++) {
		cout << str[i] << '\n';
	}

	return 0;
}

 

반응형