- 질문 게시판입니다.
Date 19/10/03 22:00:24
Name   kaestro
Subject   c++ 에서 unordered map을 pair를 key로 사용할 때 순회
문제가 지도상에 상하좌우로 증식하는 세포가 주어질 때[맵의 크기 제한 없이] 일정 시간이 지난 후 살아있는 세포의 수를 세는 문제를 풀고 있는데,

솔루션에서는 문제 상에서 숫자 제약조건 때문에 나올 수 있는 최대보다 큰 배열을 이용해서 문제를 해결했는데, 저는 실제로 map 자료구조를 이용해서 문제를 풀어보고 싶어 그렇게 문제를 풀었습니다.

c++ map을 써서 돌아가는 코드는 만들었는데, 크기가 커지면 시간 제약 조건을 통과하지 못해서, 그럼 unordered map을 쓰면 되지 않을까? 하는 생각에 unordered_map으로 자료구조를 바꿨는데 지금 insert를 하고 나서 순회를 하면 문제가 생기더라구요.

아래 코드에서 simulation에서 iterator가 breeding을 하고 나면, 저장되어있는 simulation의 구조가 변형이 되면서 아직 순회해야하는 세포는 건너뛰거나, 아까전에 순회했던 세포를 재차 순회하는 문제가 발생하고 있습니다.

이 문제를 해결하려고 map을 따로 copy 뜨는 식으로 문제도 풀어봤는데, 이건 map을 copy하는게 오래 걸려서 그런지 기존의 map을 이용한 풀이보다 속도가 떨어지더라구요.

이런 경우에 unordered_map에 새로운 노드를 추가하면서, 아직 순회하지 않은 노드를 순회하고, 기존의 unordered_map을 카피하지 않는 방법이 있을까요?

감사합니다.

void simulate() {
    for (int i = 0; i < timeLimit; ++i) {
        for (myMap::iterator it = simulation.begin(); it != simulation.end();++it) {
          if (it->second.active == DEAD || it->second.lifetime == -1) continue;
          if (it->second.active == ACTIVE) {
                const ii& pos = it->first;
                const StemCell& sc = it->second;
                breed(pos, sc);
                it = simulation.find(pos);
            }
        }

        for (myMap::iterator it = simulation.begin(); it != simulation.end(); ++it) {
            it->second.increment();
        }
    }
}

void breed(const ii& pos, const StemCell& st) {
    for (int d = 0; d < direction.size(); ++d) {
        ii nextPos = { pos.first + direction[d].first, pos.second + direction[d].second };
        myMap::iterator it = simulation.find(nextPos);
      if (it == simulation.end()) {
            simulation[nextPos] = StemCell(-1, st.healthPoint);
        } else if (it->second.lifetime == -1){
          if (it->second.healthPoint < st.healthPoint) {
            it->second.healthPoint = st.healthPoint;
            }
        }
    }
}

ps. 전에 이런 질문 올렸을 때 코드 전문을 올려달라 하신 분이 계셨어서, 링크를 달아 둡니다.
(stl map 사용) https://github.com/kaestro/algorithms/blob/master/swexpert%20academy/5653.cpp
(stl unorderd_map 사용) https://github.com/kaestro/algorithms/blob/master/swexpert%20academy/5653_unordered.cpp



0


목록
번호 제목 이름 날짜 조회 추천
공지 질문 게시판 이용 규정 11 토비 15/06/19 26722 4
17182 기타부모님 자동차보험료가 이렇게 비싼가요? 4 하우두유두 26/01/11 374 0
17181 IT/컴퓨터폰에서 특정 폴더의 사진만 쏙 사라졌는데 복구할 방법이 없으려나요? 6 Broccoli 26/01/06 514 0
17180 기타감옥에서 나온 친구 돈 안빌려주기로 했습니다. 3 활활태워라 26/01/06 1049 17
17179 기타아고다를 통해 해외 여행 숙소를 예약했는데 예약한 영문명이 여권에 적힌 영문명과 다릅니다. 9 한신 26/01/05 744 0
17178 여행회기역-경희대 근처 맛집 11 pils 26/01/05 520 0
17177 기타감옥에서 나온 친구가 도와달라고... 내용 추가 했습니다. 23 활활태워라 26/01/05 1116 0
17176 경제내집구매 고민입니다. 13 [익명] 26/01/03 866 0
17175 기타프린터 토너 질문입니다 3 김치찌개 26/01/02 244 0
17174 여행겨울 강릉 여행 추천 부탁드립니다. 7 흰긴수염고래 26/01/01 387 0
17173 IT/컴퓨터이마트버젼 스탠바이미 사용해보신 분 4 난감이좋아 26/01/01 724 0
17172 문화/예술만화책방을 가서 죽치고 앉을 계획입니다 30 danielbard 25/12/31 1009 0
17171 여행해맞이 남한산성 vs 두물머리 8 OshiN 25/12/31 458 0
17169 여행목베개 추천받읍니다... 7 Cascade 25/12/30 359 0
17168 진로쿠팡 그만두면 뭘 해야 좋을지 모르겠습니다 @_@. 12 활활태워라 25/12/29 1226 3
17167 게임롤 프레임 관련 질문 7 호랑이조련 25/12/29 328 0
17166 과학내연기관 자동차 배터리 충전 8 은하꾸리 25/12/28 499 0
17165 IT/컴퓨터AI 잘 아시는분에게 여쭤봅니다. 구글 제미나이 vs ChatGPT 8 Picard 25/12/28 706 0
17164 여행레이어링 고수분께 여쭤보고 싶습니다 6 blu 25/12/24 638 0
17163 의료/건강뇌출혈로 인한 응급실 입원. 중환자실 자리가 없다고 합니다. 3 누가말했나 25/12/23 977 0
17162 문화/예술발견되면 굉장할 기록유산? 13 OshiN 25/12/23 984 0
17161 기타300만원대(300~400만원 수준)겜트북을 사려고 합니다. 19 Wolf 25/12/22 802 0
17160 기타캡슐커피 머신 및 캡슐 질문드립니다 9 danielbard 25/12/20 563 0
17159 기타아울렛에서 겨울용 운동화를 사려고합니다. 4 쉬군 25/12/20 562 0
17158 연애글카 드라이버 업뎃 후 게임 하다가 바탕화면 나올 때 5 린디합도그 25/12/19 362 0
목록

+ : 최근 2시간내에 달린 댓글
+ : 최근 4시간내에 달린 댓글

댓글