강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

창신동 장첸님의 프로필 이미지
창신동 장첸

작성한 질문수

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

교안 p.47 하단 map의 참조특징

작성

·

144

0

참조만 하더라도 key-value 엔트리가 추가되는 map의 특성때문에 헷깔리는 부분이 있어 질문드립니다.

#include<iostream>
#include<map>
#include<unordered_map>

using namespace std;

map<string, int> m1;
unordered_map<string, int> umap;
int main(){

    if(m1.find("key1") == m1.end()){
        for(auto e : m1)cout << e.first << " : " << e.second << "\n";
        //출력되는 것 없습니다.
    }

    //p48 상단코드
    if(m1["key1"] == 0){
        for(auto e : m1)cout << e.first << " : " << e.second << "\n";
        //key1 : 0
    }
    return 0;
}

key의 존재유무를 find메소드로 판단하는 경우(위 코드 첫 번째 if문) :

key-value가 추가되지 않으므로 '존재유무' 판단이 명확합니다.

 

key의 존재유무를 value자료형의 초기값으로 판단하는 경우(위 코드 두 번째 if문) :

참조만으로 key-value가 추가되어 '존재유무' 판단이 명확하지 않은 것 같습니다.

 

질문) 그럼에도 두 번째 if문 방식을 소개해주신 것에 대해 선생님께서 어떤 의도가 있으셨는지 궁금합니다

답변 1

0

큰돌님의 프로필 이미지
큰돌
지식공유자

안녕하세요. ㅎㅎ 날카로운 지적 감사합니다. 해당 부분 보완해서 교안 업데이트 했습니다.

수정된 설명은 다음과 같습니다.

그렇기 때문에 다음 코드처럼 “맵에 요소가 있는지 없는지"를 확인하고 맵에 데이터를 할당하는 부분의 로직을 다음과 같이 구축할 수 있습니다. 

#include <bits/stdc++.h>
using namespace std;  
map<int, int> mp;
map<string, string> mp2;
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
    if(mp[1] == 0){
        mp[1] = 2;
    }
    for(auto i : mp) cout << i.first << " " << i.second;
   
    return 0;
}
/*
1 2
*/

다만 앞의 코드는 문제에서 해당 키값에 0이 아닌 값이 들어갈 때 활용이 가능합니다. 만약 문제에서 키에 0이 들어가는 경우 앞의 코드는 활용이 불가능합니다. 

이미 if문 안에 mp[1] == 0을 해버린 순간 이미 mp[1] = 0이 할당되어버리기 때문이죠. 

#include <bits/stdc++.h>
using namespace std;  
map<int, int> mp;
map<string, string> mp2;
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
    if(mp.find(1) == mp.end()){
        mp[1] = 2;
    }
    for(auto i : mp) cout << i.first << " " << i.second;
   
    return 0;
}
/*
1 2
*/

만약 문제에서 맵의 키 - 값에서 값에 0이 들어가는 경우에는 앞의 코드로 쓰는게 좋습니다. 또한 이런걸 비교해서 구현하기가 귀찮다 라고 한다면 그냥 앞의 코드를 기반으로 작성하면 됩니다.

감사합니다.

답변감사합니다.

"앞의코드" 라는 말이 나온 문단의 가장 가까운 상단의 코드를 말씀하시는 것으로 간주하여 이해했습니다

수정된 pdf에서 "앞의코드"라는 단어가 여러번 나오는데 좀 더 정확한 표기를 위해 소스코드에 번호를 부여해서 지칭해주시면 좋을 것 같다는 의견을 드리고 싶습니다.

소스코드를 새로 추가하는 상황에는 앞뒤 번호가 하나씩 밀려 전부 수정해야하는 번거로움이 생기는 에러사항도 있을것같습니다....ㅠㅠ

 

큰돌님의 프로필 이미지
큰돌
지식공유자

ㅎㅎ 검토해보겠습니다.

창신동 장첸님의 프로필 이미지
창신동 장첸

작성한 질문수

질문하기