inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

148

창신동 장첸

작성한 질문수 115

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문 방식을 소개해주신 것에 대해 선생님께서 어떤 의도가 있으셨는지 궁금합니다

코테 준비 같이 해요! C++

답변 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이 들어가는 경우에는 앞의 코드로 쓰는게 좋습니다. 또한 이런걸 비교해서 구현하기가 귀찮다 라고 한다면 그냥 앞의 코드를 기반으로 작성하면 됩니다.

감사합니다.

0

창신동 장첸

답변감사합니다.

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

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

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

 

0

큰돌

ㅎㅎ 검토해보겠습니다.

1-E질문입니다!

0

533

2

3-L 틀린 부분 피드백 부탁드립니다.

0

835

2

1-A문제 순열재귀함수 질문입니다.

0

396

1

1-A 일곱난쟁이문제입니다

0

470

1

문제 풀 때 방향성에 대해

0

809

1

맥에서 vs code로 실행 관련 질문입니다

0

530

1

17071번 메모리 초과

0

390

1

1-C질문입니다!

0

428

2

2-B BFS 시간초과질문

0

638

2

1-O 13번 라인

0

447

1

6-J 놀이공원 문제 질문

0

389

1

구현관련 질문

0

491

1

강의 교안

0

322

1

실력을 더 올리고나서 강의를 보는 것이 맞을까요?

0

550

1

안녕하세요! 재귀함수에 관해서 질문드립니다

0

540

1

1-K

0

481

2

3-G번 질문있습니다.

1

480

3

3-C 실행 시간 질문드립니다.

0

503

1

4-A 문제 풀이 질문있습니다.

0

601

2

비트마스킹 연산자 "1의 보수" 영문 표기법

0

441

1

격자탐색 문제에서 BFS 시간복잡도 질문드립니다.

0

349

1

3-O go 함수 질문 드립니다.

1

453

2

4-A 출력 질문

0

308

1

1주차 1-O 질문드립니다

0

265

1