본문 바로가기

프로그래밍 언어/C, C++

[Hackerrank] 25. Maps-STL

25. Maps-STL

[ 난이도: Easy | 분야: STL ]

1. 내용 정리

Map은 C++의 STL의 일부이다. Maps는 특정한 순서를 따르는 key값과 연결된 값들을 결합한 형태의 요소들을 저장한다.

자주 사용하는 Map의 멤버 함수는 다음과 같다:

Map 템플릿

std::map <key_type, data_type>

 

선언

map<string,int< m;

 

크기

int length = m.size();

 

삽입

m.insert(make_pair("hello",9));

 

요소 삭제

m.erase(val);

val에 해당하는 pair를 map에서 제거한다.

 

요소 찾기

map<string,int>::iterator itr=m.find(val);

값이 있다면 iterator를 반환하고 없다면 m.end()를 반환한다.

 

key로 저장된 값 접근하기

m["MAPS"]

 

2. 과제

당신은 학교에서 선생님의 조수로 선정되었고 그녀는 학생들의 답안지를 채점하고 있다.

각 학생들은 이중 답안지를 가지고 있다. 그래서 선생님은 Q개의 쿼리를 가지고 있다:

1 X Y: 학생 이름이 X인 데이터에 마크 Y를 추가한다.

2 X: 학생 이름이 X인 데이터의 마크를 제거한다.

3 X: 학생 이름이 X인 데이터의 마크를 출력한다. (만약 X의 마크를 얻지 못한다면, 0을 출력한다.)

입력 형식

입력의 첫 번째 줄은 쿼리의 개수를 나타내는 Q를 가지고 있다.

그 다음 Q개의 줄은 각각 1개의 쿼리를 가지고 있다. 첫 번째 정수는 각 쿼리의 형식을 나타내는 정수를 가지고 있다.

만약 쿼리의 형식이 1이라면, 한 개의 문자열 X와 정수 Y를 가지고 있고 X는 학생의 이름, Y는 마크를 나타낸다.

만약 쿼리의 형식이 2나 3이라면, 한 개의 문자열 X를 가지고 있고 X는 학생의 이름이다.

 

제약 사항

Q는 1보다 크거나 같고 10^5보다 작거나 같다.

type은 1보다 크거나 같고 3보다 작거나 같다.

X의 절댓값은 1보다 크거나 같고 6보다 작거나 같다.

Y는 1보다 크거나 같고 10^3보다 작거나 같다.

 

출력 형식

쿼리의 형식이 3일 때 해당하는 학생의 마크들을 출력해라.

 

입력 예시

7
1 Jesse 20
1 Jess 12
1 Jess 18
3 Jess
2 Jess
3 Jess

 

출력 예시

30
20
0

 

문제

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <set>
#include <map>
#include <algorithm>
using namespace std;


int main() {
    /* Enter your code here. Read input from STDIN. Print output to STDOUT */   
    return 0;
}
더보기

정답

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <set>
#include <map>
#include <algorithm>
using namespace std;


int main() {
    /* Enter your code here. Read input from STDIN. Print output to STDOUT */
    map<string, int> m; // create map
    int q = 0; // number of queries
    cin >> q;
    for(int i = 0; i < q; i++) {
        int type; string name; int marks;
        cin >> type;
        cin >> name;
        map<string,int>::iterator itr=m.find(name);
        if(type == 1) {
            cin >> marks;
            if(itr != m.end()) {
                m[name] += marks;
            }
            else {
                m.insert({name, marks});
            }
        }
        else if(type == 2) {
            m.erase(name);
        }
        else {
            if(itr != m.end()) {
                cout << m[name] << endl;
            }
            else {
                cout << 0 << endl;
            }  
        }
    }
    return 0;
}

 

 

 

 

 

©️Hackerrank. All Rights Reserved.

'프로그래밍 언어 > C, C++' 카테고리의 다른 글

[Hackerrank] 27. Deque-STL  (0) 2024.02.22
[Hackerrank] 26. Print Pretty  (0) 2024.02.21
[Hackerrank] 24. Sets-STL  (0) 2024.02.20
[Hackerrank] 23. Lower-Bound STL  (0) 2024.02.20
[Hackerrank] 22. Vector-Erase  (0) 2024.02.19