-
[C++ STL] MAPC 프로그래밍/BOJ 2022. 9. 19. 20:41728x90
이 또한 내가 보려고 정리... 매우 러프함 주의...
"map"
- 매핑된 정보를 관리하는 컨테이너
- key와 data를 매핑한다.
- key를 기반으로 탐색한다.
- 데이터를 저장하는데 걸리는시간 O(logN), 데이터를 탐색하는데 걸리는 시간 O(logN)
- set 과 마찬가지로 순서가 중요할 때는 map, 순서가 중요하지 않고 빠른 성능이 중요할 때는 unordered_map#include <iostream> #include <string> #include <map> // map header 추가 필요 #include <unordered_map> // unordered_map 또한 header 추가 필요 using namespace std; struct _st { int x; int y; }; // map은 key와 data가 pair로 묶여 저장된다. unordered_map<string, _st> UM; int main() { // 0. 초기화 UM.clear(); // 1. 데이터 추가 UM.insert({"kim", {1, 2}}); UM.insert({"lee", {3, 4}}); UM.insert({"park", {5, 6}}); // iter가 컨테이너 안에 저장된 하나의 pair를 가리키는 포인터라고 볼 수 있다. // "->" 로 pair의 멤버에 접근하고 "." 로 구조체의 멤버에 접근한다. for (auto iter = UM.begin(); iter != UM.end(); iter++) { cout << iter->first << " " << iter->second.x << " " << iter->second.y << '\n'; } // 2. 탐색 및 값 변경 // 특정 키의 데이터를 빠르게 찾아서 쓸 수 있다. // key는 수정할 수 없고, data는 수정할 수 있다. for (string str : {"kim", "choi", "park"}) { auto iter = UM.find(str); if (iter != UM.end()) { string name = iter->first; _st &d = iter->second; d.x = 7; // x값 수정 d.y = 8; // y값 수정 c.out << "success !" << "\n"; } else { cout << "fail" << "\n"; } } // 3. 삭제 // 3-1. erase(iter) for (string str : {"kim", "na"}) { auto iter = UM.find(str); if (iter != UM.end()) { UM.erase(iter); cout << "success !" << "\n"; } else { cout << "fail" << "\n"; } } // 3-2. erase(key) // 만약 한 개 이상의 원소를 삭제하면 res의 값이 1 이상이 된다. for (string str : {"choi", "park"}) { int res = UM.erase(str); if (res > 0) { cout << "success !" << "\n"; } else { cout << "fail" << "\n"; } } }
[백준 10816] 숫자카드
https://www.acmicpc.net/problem/10816
#include <cstdio> #include <unordered_map> int N, M; using namespace std; unordered_map<int, int> UM; void input(void) { scanf("%d", &N); for (int i = 0; i < N; i++) { int n = 0; scanf("%d", &n); if (UM.find(n) == UM.end()) { // 만약 맵에 해당 숫자가 없다면 UM.insert({ n, 1 }); // 추가 } else { auto iter = UM.find(n); // 맵에 해당 숫자가 있다면 int &cnt = iter->second; cnt += 1; // 해당 원소의 데이터인 cnt를 한 개 올려줌 } } } void get_cnt(void) { scanf("%d", &M); for (int i = 0; i < M; i++) { int m = 0; scanf("%d", &m); if (UM.find(m) != UM.end()) { // 만약 맵에 해당 숫자가 있다면 auto iter = UM.find(m); printf("%d ", iter->second); // 해당 숫자(key)의 데이터(data) 출력 } else printf("%d ", 0); } } int main() { input(); get_cnt(); return 0; }
728x90'C 프로그래밍 > BOJ' 카테고리의 다른 글
[백준 14502] 연구소 (0) 2022.09.20 [백준 10043] 택시 (0) 2022.09.19 [C++ STL] SET (2) 2022.09.19 [백준 2636] 치즈 (0) 2022.09.18 [백준 2468] 안전영역 (1) 2022.09.18