기타/C++ 문법

<map> 자료구조

배발자 2022. 1. 14.
반응형

*헤더로 <map> 을 갖는다. 

 

<map>은 key 와 value 의 쌍으로 이루어진 균형 이진 트리이다. key 를 기준으로 사전순으로 정렬되어 있기 때문에 검색 속도가 빠르다. 바로 map 의 쓰임을 알아보자. 

 

string s= "my name is my name" 

 

스트링 s 에는 "나의 이름은 나의 이름" 이라는 영어 문장을 적었는데 해당 문자열의 알파벳 종류에 따른 개수를 구조화 시키고 싶을 때 <map> 이라는 자료구조를 쓰면 된다. 

 

즉, m 이라는 알파벳이 몇개가 나왔는지 알고 싶다면 map 을 활용 하면 된다.

 

map 은 여러 타입을 묶음으로 가질 수 있으니 사용자는 문제에 맞는 구조로 구현 하면 된다. 

 

map < string, char> 변수명  

map< char, int > 변수명 

map < int, int > 변수명  ..등

 

 

"MYNAM" 이라는 문자열을 <map> 을 사용했다면 다음과 같이 구조가 만들어진다. 

 

이어지는 코드는 "my name is my name" 이라는 문자열을 가지고 <map> 을 적용한 코드다. 그림을 보면서 맵의 구조를 확인하고 어떻게 사용하는지 바로 연습하자. 

#include <map>
#include <iostream>

using namespace std; 

int main() {
	map < char, int> m1; 
	
	string s = "my name is my name"; 
	for (char c : s)m1[c]++; 
	for (auto it = m1.begin(); it != m1.end(); it++) {
		cout << it->first << " " << it->second<<"\n";
	}cout << "\n\n\n"; 
	//또는 
	for (auto x : m1) cout << x.first << " " << x.second << "\n"; 
}

 

 

 

맵과 벡터의 활용

#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
using namespace std; 
int n; 
map<int, int> order;
bool cmp(pair<int, int> a, pair <int, int> b) {
	if (a.second == b.second) {
		return order[a.first] < order[b.first]; 
	}
	else return a.second > b.second; 
}
int main() {
	cin >> n;
	int b; cin >> b;
	map<int, int> m;
	int s = 1;
	for (int i = 0; i < n; i++) {
		int a; cin >> a;
		m[a]++;
		if (!order[a])order[a] = s++;
	}
	vector <pair<int, int>> v(m.begin(), m.end());
	sort(v.begin(), v.end(), cmp);
	for (int i = 0; i < v.size(); i++) {
		for (int j = 0; j < v[i].second; j++) {
			cout << v[i].first << " "; 
		}
	}
	return 0;
}

 

 

2910번: 빈도 정렬

첫째 줄에 메시지의 길이 N과 C가 주어진다. (1 ≤ N ≤ 1,000, 1 ≤ C ≤ 1,000,000,000) 둘째 줄에 메시지 수열이 주어진다.

www.acmicpc.net

 

반응형

'기타 > C++ 문법' 카테고리의 다른 글

<set> 자료구조  (0) 2022.01.14
<priority_queue> 자료구조  (0) 2022.01.14
<sort> 오름차순, 내림차순으로 정렬하자  (0) 2022.01.14
<sqrt> 제곱근(루트)  (0) 2022.01.13
<abs> 절댓값 반환  (0) 2022.01.13

댓글