ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C++ STL] MAP
    C 프로그래밍/BOJ 2022. 9. 19. 20:41
    728x90

    이 또한 내가 보려고 정리... 매우 러프함 주의...

     

    "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

     

    10816번: 숫자 카드 2

    첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,

    www.acmicpc.net

    #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

    댓글

Designed by Tistory.