0. 들어가기 전에

C++에서 map은 key와 value를 한 쌍으로 저장하는 자료구조이다. 쉽게 말하면,

map<키자료형, 값자료형> 변수명;
형태로 사용하며, 특정 key를 기준으로 value를 빠르게 찾을 때 사용한다.

// 예를 들어 이름별 점수를 저장한다면 다음과 같이 사용할 수 있다.
map<string, int> score;

score["kim"] = 90;
score["lee"] = 80;
이렇게 저장하면 "kim"이라는 이름을 통해 90이라는 점수를 가져올 수 있다.

1. map 기본 개념

  • map 이란?
    C++에서 map은 key와 value를 한 쌍으로 저장하는 자료구조이다. 쉽게 말하면,
    map<키자료형, 값자료형> 변수명;
    형태로 사용하며, 특정 key를 기준으로 value를 빠르게 찾을 때 사용한다.
    
    // 예를 들어 이름별 점수를 저장한다면 다음과 같이 사용할 수 있다.
    map<string, int> score;
    
    score["kim"] = 90;
    score["lee"] = 80;
    이렇게 저장하면 "kim"이라는 이름을 통해 90이라는 점수를 가져올 수 있다.
  • map 사용하는 이유
    map은 다음과 같은 상황에서 자주 사용한다.=> 어떤 값을 기준값(key) 으로 저장하고 나중에 다시 찾고 싶을 때 사용한다.
    이름 -> 점수
    상품명 -> 가격
    문자열 -> 등장 횟수
    번호 -> 이름

 

 

 


2. map 기본 사용법

  • map 선언하기
    map을 사용하려면 헤더를 포함해야 한다.
    #include <map>
    
    기본 선언 방식은 다음과 같다.
    map<key자료형, value자료형> 변수명;
    
    예시이다.
    map<string, int> m;
    - 문자열(string) key
    - 정수(int) value
    ​
  • map에 값 저장하기
    map에 값을 저장할 때는 대괄호 []를 사용한다.
    map<string, int> m;
    
    m["apple"] = 1000;
    m["banana"] = 2000;
    m["orange"] = 3000;

    위 코드는 다음과 같은 데이터를 저장한다.
    key value
    apple 1000
    banana 2000
    orange 3000
    (즉, "apple"이라는 key에는 1000이라는 value가 저장된다.)

  • map에서 값 가져오기
    저장된 값은 key를 이용해서 가져올 수 있다.
    cout << m["apple"];
    
    //출력결과
    1000
    
    //전체 예시 코드
    
    #include <iostream>
    #include <map>
    #include <string>
    
    using namespace std;
    
    int main() {
        map<string, int> m;
    
        m["apple"] = 1000;
        m["banana"] = 2000;
    
        cout << m["apple"] << endl; // 1000
        cout << m["banana"] << endl; // 2000
    
        return 0;
    }

3. map의 주요 특징

  • key는 중복될 수 없다
    map에서 key는 중복될 수 없다. ⇒ 즉, 같은 key에 값을 다시 넣으면 덮어쓰기가 된다.
    map<string, int> m;
    
    m["apple"] = 1000;
    m["apple"] = 1500;
    
    이 경우 "apple"이라는 key가 두 번 저장되는 것이 아니라, 기존 값이 수정된다.
    결과적으로 map에는 다음 값만 남는다.
    
    apple -> 1500
  • key 기준으로 자동 정렬된다.
    map은 기본적으로 key를 기준으로 오름차순 정렬된다.
    map<string, int> m;
    
    m["banana"] = 2000;
    m["apple"] = 1000;
    m["orange"] = 3000;
    
    // 출력시
    apple
    banana
    orange
    
    //예시 코드
    #include <iostream>
    #include <map>
    #include <string>
    
    using namespace std;
    
    int main() {
        map<string, int> m;
    
        m["banana"] = 2000;
        m["apple"] = 1000;
        m["orange"] = 3000;
    
        for(auto item : m) {
            cout << item.first << " " << item.second << endl;
            // .first, .second => 바로 뒤 6번에서 다룸
        }
    
        return 0;
    }
    
    //출력 결과는 다음과 같다.
    apple 1000
    banana 2000
    orange 3000

4. map 반복문 사용법 

  • first와 second 사용법
    map은 반복문으로 전체 데이터를 확인할 수 있다.
    for(auto item : m) {
        cout << item.first << " " << item.second << endl;
    }
    

    여기서 중요한 문법은 다음과 같다.
    문법 의미
    item.first key
    item.second value

    예시
    map<string, int> m;
    
    m["kim"] = 90;
    m["lee"] = 80;
    m["park"] = 70;
    
    for(auto item : m) {
        cout << item.first << " : " << item.second << endl;
    }
    
    //출력결과
    kim : 90
    lee : 80
    park : 70



5. map에서 key 존재 여부 확인하기

  • find 함수 사용법
    find()는 map 안에 특정 key가 있는지 확인할 때 사용한다.
    m.find(key)
    만약 key가 존재하면 해당 위치를 반환하고, 존재하지 않으면 m.end()를 반환한다.

    => 그래서 보통 아래와 같이 사용한다.
    if(m.find("apple") != m.end()) {
        cout << "존재함";
    }
    else {
        cout << "존재하지 않음";
    }
    ​
  • find를 사용하는 이유
    map에서 단순히 다음처럼 접근할 수도 있다.
    m["apple"]

    하지만 주의할 점이 있다. 존재하지 않는 key를 []로 접근하면, map에 새로운 값이 자동으로 추가된다.
    map<string, int> m;
    
    cout << m["apple"];
    
    //apple이라는 key를 저장한 적이 없는데도, map에는 자동으로 다음 값이 추가된다.
    apple -> 0
    그래서 단순 조회 목적이라면 find()를 사용하는 것이 안전하다.

    예를 들어 다음 코드를 보자.
    #include <iostream>
    #include <map>
    #include <string>
    
    using namespace std;
    
    int main() {
        map<string, int> m;
    
        m["apple"] = 1000;
        m["banana"] = 2000;
    
        if(m.find("apple") != m.end()) {
            cout << "apple은 존재합니다." << endl;
            cout << m["apple"] << endl;
        }
    
        if(m.find("orange") == m.end()) {
            cout << "orange는 존재하지 않습니다." << endl;
        }
    
        return 0;
    }
    
    // 출력결과
    apple은 존재합니다.
    1000
    orange는 존재하지 않습니다.
    ​
  • count 함수 사용법
    count()도 특정 key가 존재하는지 확인할 때 사용할 수 있다.
    m.count(key)
    
    map은 key가 중복되지 않기 때문에 결과는 항상 0 또는 1이다.
    결과 의미
    0 key가 없음
    1 key가 있음

    예시( find()보다 간단하게 존재 여부만 확인하고 싶을 때 사용하기 좋다. )
    if(m.count("apple")) {
        cout << "apple 존재";
    }


  • find와 count 차이
    find()와 count()는 둘 다 key 존재 여부를 확인할 수 있다.단순히 존재 여부만 확인할 때는 count()가 간단하다. 
    함수 특징
    find() key가 있으면 해당 위치를 반환
    count() key가 있으면 1, 없으면 0 반환

(참고) [프로그래머스/C++] 추억 점수 (Lv.1)

(참고)[프로그래머스/C++] 가장 가까운 같은 글자 (Lv.1)


6. map 데이터 관리 함수

  • size 함수로 데이터 개수 확인하기
    map에 저장된 데이터 개수는 size()로 확인한다.

    예시
    map<string, int> m;
    
    m["apple"] = 1000;
    m["banana"] = 2000;
    
    cout << m.size(); // 출력결과: 2
  • erase 함수로 데이터 삭제하기
    특정 key를 삭제할 때는 erase()를 사용한다.
    m.erase("apple");
    
    //예시
    
    map<string, int> m;
    
    m["apple"] = 1000;
    m["banana"] = 2000;
    
    m.erase("apple");
    // 이후 map에는 "banana"만 남는다.
    
    // 전체 데이터를 삭제하고 싶다면 clear()를 사용한다.
    m.clear();

7. map에서 자주 사용되는 문법 총정리

문법 의미
map<string, int> m; string key, int value를 가지는 map 선언
m["apple"] = 1000; key가 apple인 곳에 1000 저장
m["apple"] apple key의 value 가져오기
m.find("apple") apple key가 있는지 탐색
m.find("apple") != m.end() apple key가 존재함
m.find("apple") == m.end() apple key가 존재하지 않음
m.count("apple") apple key 존재 여부 확인
m.erase("apple") apple key 삭제
m.clear() map 전체 삭제
m.size() map 크기 확인

 


8. map과 unordered_map 차이 

  • C++에는 map과 비슷한 unordered_map도 있다. 
    구분 map unodered_map
    정렬 여부 key 기준 자동 정렬 정렬되지 않음
    내부 구조 트리 기반 해시 기반
    탐색 속도 O(log N) 평균 O(1)
    헤더 <map> <unordered_map>
    사용 상황 정렬이 필요할 때 빠른 탐색이 중요할 때
    알고리즘 문제에서는 단순히 key로 value를 빠르게 찾는 목적이라면
    => unordered_map을 더 많이 사용하기도 한다. 하지만 map은 key가 자동 정렬된다는 장점이 있다.

9. 최종 요약

map은 key와 value를 한 쌍으로 저장하는 C++ STL 자료구조이다.

특정 key를 기준으로 값을 빠르게 찾을 수 있어 이름-점수 매핑, 문자열 등장 횟수 세기, 상품명-가격 저장 같은 문제에서 자주 사용된다.

핵심 문법은 다음과 같다.

map<string, int> m;

m["apple"] = 1000;          // 값 저장
cout << m["apple"];         // 값 조회

if(m.find("apple") != m.end()) {
    cout << "존재함";
}

if(m.count("apple")) {
    cout << "존재함";
}

m.erase("apple");           // 특정 key 삭제
m.clear();                  // 전체 삭제


map을 사용할 때 가장 중요한 점은 다음과 같다.

  • key는 중복될 수 없다.
  • 같은 key에 값을 다시 넣으면 기존 값이 덮어쓰기 된다.
  • map은 기본적으로 key 기준 오름차순 정렬된다.
  • 존재 여부 확인은 find() 또는 count()를 사용한다.
  • 존재하지 않는 key를 [ ]로 접근하면 자동으로 값이 추가될 수 있으므로 주의해야 한다.
  • 정렬이 필요 없고 빠른 탐색이 중요하다면 unordered_map도 고려할 수 있다.

결론적으로 map은 특정 값을 기준으로 다른 값을 저장하고 찾아야 하는 문제에서 매우 유용하다.

(참고) [프로그래머스/C++] 가장 가까운 같은 글자 (Lv.1)

(참고) [프로그래머스/C++] 추억 점수 (Lv.1)

 

+ Recent posts