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

kkh185924님의 프로필 이미지

작성한 질문수

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

1-L

1-L 1940 주몽 질문있습니다!!

해결된 질문

23.12.09 22:07 작성

·

131

0

안녕하세요 선생님.이 문제를 맵을 이용해 풀어보려고 했는데요.692 7 4 1 5 3예시가 이렇게 들어올 때 mp[2]=7, mp[7]=2, mp[4]=5 ..... 이런 식으로 저장한 후에 맵을 순회하며 그 해당 요소의 value 값과 똑같은 key의 값이 0이 아니라면 ret을 1 증가시키고 짝이 맞는 key값들은 삭제하는 로직으로 짜봤습니다.예시는 맞지만 틀립니다.궁금한 점은 1.맵을 순회하면서 맵의 요소를 erase하면 문제가 생기는지(디버깅을 해보니 제가 원하는 방식과 다르게 작동하더라구요)2.조건에 맞는 요소들을 안전하게 제거하면서 맵을 순회할수 있는 방법이 있는지입니다.http://boj.kr/8d1b67b0e4c64c5ba02d48e5a656025c

답변 1

0

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

2023. 12. 10. 12:21

안녕하세요 kkh님 ㅎㅎ

1.맵을 순회하면서 맵의 요소를 erase하면 문제가 생기는지(디버깅을 해보니 제가 원하는 방식과 다르게 작동하더라구요)2.조건에 맞는 요소들을 안전하게 제거하면서 맵을 순회할수 있는 방법이 있는지입니다

>> 네 맵을 순회하면서 맵의 요소를 erase하는 것자체는 안전하지 못한 방법입니다. 순회하다가 해당 요소가 사라질 수도 있기 때문에 예상한 로직과 다르게 나타날 수 있는 것이죠.

kkh님이 의도하신 건 아마 이런게 아닐까 싶습니다.

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n, m;
    cin >> n >> m;
    map<int, int> mp;
    vector<int> keys;
    int ret = 0;

    for (int i = 0; i < n; i++) {
        int temp;
        cin >> temp;
        mp[temp]++;
        keys.push_back(temp);
    }

    for (int key : keys) {
        if (mp.find(key) != mp.end() && mp.find(m - key) != mp.end()) {
            if (key != m - key || mp[key] > 1) {
                ret++;
                mp.erase(key);
                mp.erase(m - key);
            }
        }
    }

    cout << ret;
    return 0;
}

지금 보시는 것처럼 키에 대한 것을 vector에다 담아서 해당 요소가 사라지더라도 안전하게 순회하면서도 mp.find를 통해 로직을 수행한 것을 볼 수 있습니다.

 

이렇게 한번 제출해보시겠어요?



 


또 질문 있으시면 언제든지 질문 부탁드립니다.

좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림.