- 질문 게시판입니다.
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


목록
번호 제목 이름 날짜 조회 추천
10365 기타착하고 순해보이는 인상은 무시당하나요? 7 [익명] 20/11/01 5827 0
15102 의료/건강유리 화장실을 가리고 싶습니다. 18 [익명] 23/08/02 5827 0
1657 기타10명 내외의 모임장소 추천 5 레이드 16/10/16 5826 0
3047 의료/건강비타민D 과잉 섭취에 따른 부작용?? 6 다람쥐 17/07/13 5826 0
3708 과학감자튀김과 감자볶음의 차이가 뭔가요??? 17 사나남편 17/11/18 5826 0
7974 IT/컴퓨터c++ 에서 unordered map을 pair를 key로 사용할 때 순회 7 kaestro 19/10/03 5826 0
9393 기타천정형에어컨 청소업체 금액차이가 왜 이렇게 편차가 큰가요? 7 오리꽥 20/05/13 5825 0
4188 경제경전철 새로 생기는 역의 정확한 위치를 알 수 있나요? 3 별빛 18/02/21 5824 0
8241 체육/스포츠마프대란에 혹해서 넘어간 사람 7 우디르 19/11/11 5824 0
11005 기타중고 피아노 문의 드립니다 3 행운 21/02/11 5824 0
12057 의료/건강안구건조증 치료 방법에 대해서 질문 드려요 10 말하는감자 21/08/16 5824 0
3876 의료/건강요즘 감정조절이 힘듭니다 (pms +우울증?) 9 [익명] 17/12/21 5823 0
4839 교육글을 잘쓰려면 어떻하나요? 24 활활태워라 18/06/15 5823 0
9859 IT/컴퓨터PostgeSQL 참고서나 동영상 강의 추천 부탁드려요. 6 다크쵸코 20/07/31 5823 0
11649 기타남자 속눈섭펌하면 이상할까요? 13 copin 21/06/01 5823 0
11816 IT/컴퓨터메모장에서 특정 단어를 특전 단어로 바꾸는 기능이 있나요? 3 오리꽥 21/07/01 5823 0
12853 IT/컴퓨터아이패드를 잘 모릅니다. 추천좀 부탁드립니다. 5 soulless 22/01/18 5823 0
14759 IT/컴퓨터pc에서 유튜브를 팟플레이어로 보시는 분 계신가요? 5 John Petrucci 23/04/30 5823 0
1253 체육/스포츠지금 피파랭킹이 국가의 현재 실력을 잘 반영하고 있나요? 12 전기공학도 16/07/03 5822 0
4822 댓글잠금 기타후보자 재산 공개에서 신고거부는 백퍼 구린거 맞겠죠? 24 [익명] 18/06/13 5822 0
8660 IT/컴퓨터윈도우 보안 문의 7 흥차넷 20/01/22 5822 0
4220 게임플스4 뭘 사는것이 좋을까요? 12 naru 18/02/28 5821 0
2353 연애부농부농할때 그냥 물어볼래요 ㅋㅋㅋ 메세징앱 뭐 쓰시나요 들 44 elanor 17/02/19 5820 0
5311 홍차넷사먹는 김치 질문입니다. 15 naru 18/08/23 5820 0
7951 기타외국에서 오래 거주하다가 잠시 한국에 들를 때 휴대폰 어떻게 해야할까요? 3 droysen 19/09/29 5820 0
목록

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