- 질문 게시판입니다.
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 23851 4
16446 의료/건강운전면허 적성검사 온라인 신청 위한 국가건강검진 2 + 다람쥐 25/01/08 67 0
16445 게임게임 고수님들 저도 게임 추천좀 부탁드립니다... 8 + 퍼그 25/01/08 236 0
16444 게임게임 고수님들 게임 추천부탁드립니다.. 44 + Mandarin 25/01/08 392 0
16443 의료/건강손에 원인모를 멍이 계속 생깁니다. 3 [익명] 25/01/07 334 0
16442 게임엑스박스 공식 컨트롤러 질문 4 치즈케이크 25/01/07 125 0
16441 기타경품으로 취득한 자동차의 소유권 이전에 대한 질문입니다. 4 [익명] 25/01/07 355 0
16440 기타아파트 지하주차장 경사로 주차 무개념 17 + 방사능홍차 25/01/07 528 0
16438 경제국내상장 해외ETF의 자금흐름별 세금이 궁금합니다. 7 월급루팡실전편 25/01/06 311 0
16437 가정/육아교장이 폭언, 갑질로 뉴스를 탔는데요 교체가 안되는 거 같습니다 2 2024 25/01/06 705 0
16436 기타TV 질문입니다 5 김치찌개 25/01/06 278 0
16435 의료/건강(혐) 숙소에서 벌레가 나왔습니다... 6 얌전한 고양이 25/01/06 543 0
16434 기타이 가방 부자재 이름이 뭘까요? 6 다람쥐 25/01/05 496 0
16433 경제상속세 한도 내에서의 금융투자 계획 7 알탈 25/01/05 449 0
16432 문화/예술제 짧은 글 냉정한 평가 부탁드립니다. 7 comping 25/01/05 435 0
16431 IT/컴퓨터상담 시 활용하기 좋은 AI? 4 [익명] 25/01/05 224 0
16430 가정/육아이공계성향을 보이는 아이 적성 발달을 위한 조언을 구합니다. 9 FTHR컨설팅 25/01/04 671 0
16429 여행도쿄 3박 4일 추천 부탁드립니다. 8 danielbard 25/01/04 334 0
16428 여행속초 물회맛집 알려주십시오 6 쉬군 25/01/02 372 0
16427 의료/건강쥐가 얼마나 더러운가요? 물건 버려야 되는지 6 조홍 25/01/02 687 0
16426 기타상처로 인한 분노에서 벗어나는 방법이 무엇인가요 6 [익명] 25/01/02 672 0
16425 가정/육아싱크대 배수구 생김새 질문 2 은하꾸리 25/01/01 258 0
16424 IT/컴퓨터부모님 가정용 pc 견적 9 Beemo 25/01/01 416 0
16423 IT/컴퓨터PC 카톡에서 메시지 보낼때.. 6 어제내린비 25/01/01 417 0
16422 기타카니발 vs 펠리세이드 풀체인지 최종 고민 질문입니다. 36 쉬군 24/12/31 652 0
목록

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

댓글