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

이종현님의 프로필 이미지

작성한 질문수

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

C++알고리즘 교안

알고리즘 교안 103페이지 map 사용시 주의점

해결된 질문

작성

·

207

0

103p 앞부분 설명에서,

'다만 앞의 코드는 문제에서 해당 키값에 0이 아닌 값이 들어갈 때 활용이 가능합니다. 만약 문제에서 키에 0이 들어가는 경우 앞의 코드는 활용이 불가능합니다.
예를 들어 문제에서 {0, : 주홍철}, {1, 역사} 이렇게 담는다면 불가능하고, {1 : 주홍철} , {2, 역사} 이렇게 담는다면 해당 로직에 사용가능합니다.'

부분이 잘 이해가 가지 않습니다..

왜 {0, : 주홍철}, {1, 역사} 이렇게는 불가능한 것이고 {1 : 주홍철} , {2, 역사} 이렇게면 가능한 것인가요?
102p 코드 예시는 map<int, int>인데 103p 설명 예시는 map<int,string>인 경우에서 다시 설명해주신 것 같은데 잘 이해가 가지 않습니다 ..

답변 3

1

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

안녕하세요 종현님ㅎㅎ

예를 들어 문제에서 {0, : 주홍철}, {1, 역사} 이렇게 담는다면 불가능하고, {1 : 주홍철} , {2, 역사} 이렇게 담는다면 해당 로직에 사용가능합니다. 

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


이 부분 말씀하시는거죠?

이부분 설명을 제가 잘못한 거 같습니다 key가 아니라 value에 들어가는 값이 0이 되면 안되는데 해당 부분 설명이 잘못되어있네요.

다시 설명하자면 다음과 같습니다.

 

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

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


image

해당부분은 교안에 반영될 예정입니다.

또 이해 안 되시면 말씀해주시면 다시 답변 드리겠습니다.

감사합니다.

0

이종현님의 프로필 이미지
이종현
질문자

find 메서드로 해결을 했지만 원리에 대해 이해하고 싶어서 질문드립니다!

0

이종현님의 프로필 이미지
이종현
질문자

int N;

string ret;

map<char, int> m;

int main() {

cin >> N;

for(int i = 0; i < N; i++) {

string s;

cin >> s;

if (m[s[0]] != 0) {

m[s[0]] += 1;

} else {

m.insert({s[0], 1});

}

}

for(auto it : m) cout << "it.first: "<< it.first << " it.second " << it.second << '\n';

}
혹시 해당 코드에서도 it.second가 항상 0인데 위 질문 개념에 근거한 이유일까요?
저는 if (m[s[0]] != 0)에서 s[0]와 동일한 key에 접근해서 해당 키의 value가 0이 아니라면 해당 value에 += 1을 해주려고 하는데 디버깅해보면 insert된 후 value들에 0이 계속 할당되는 것 같더라구요 ㅜ

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

mp[0] 이런식으로 참조를 하게 되는 순간 0이 생겨버리게 됩니다.

예를 들어 if(mp[0]) 을 하기만 해도.

mp[0] = 0으로 할당되게 됩니다. 그래서 value에 0이 들어가는 로직에는 사용할 수 없습니다.

map에 ~~한 요소가 있는지를 확인하고 어떠한 로직을 구축하고 싶은데 참조하는 순간 0이 들어가니까요.