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


목록
번호 제목 이름 날짜 조회 추천
1329 여행홍천 휴양림에 2박 3일간 가게 되었습니다. 조언 부탁드립니다. 2 Vinnydaddy 16/07/25 5528 0
2915 문화/예술재밌게 읽으신 소설 추천 부탁드립니다. 26 여름 소나기 후 17/06/17 5528 1
3588 IT/컴퓨터동아리 컴퓨터에 윈도우 10을 까는데 도움이 필요합니다 ㅜㅜ 3 코리몬테아스 17/10/29 5528 0
8554 여행포항 맛집 추천부탁드립니다. 9 야근하는밤비 19/12/28 5528 0
10191 IT/컴퓨터CCTV 설치 쉬운가요? 7 덕후나이트 20/09/30 5528 0
11393 게임플5랑 스위치 오프라인 구매 관련 4 어드전 21/04/20 5528 0
14489 문화/예술10만원대의 선물용 와인 구매하려면 어디로...? 13 cummings 23/02/14 5528 0
5265 홍차넷서울에서 맛있는 케익 파는 곳 알려주세요!!! 42 naru 18/08/15 5529 0
12667 교육글쓰기 강좌 추천 부탁드려요 5 아침 21/12/10 5529 0
4053 의료/건강심전도 검사를 받았는데 간수치가 220이 나왔습니다. 8 [익명] 18/01/23 5530 0
6508 여행해외여행 초보가 하노이 여행 일정 짜보려고 합니다;;; 12 HeatWade 19/02/10 5530 0
7915 의료/건강신약 시험에서 위약실험을 하는 이유는 뭔가요? 23 토비 19/09/24 5530 0
10224 기타(예전) 만화 제목을 찾습니다. 5 LemonTree 20/10/07 5530 0
13316 연애적절한 데이트 비용 분담에 대하여 의견 구합니다. 23 [익명] 22/04/30 5530 0
14665 가정/육아숨막히고 힘듭니다. 제발 도와주세요. 21 [익명] 23/04/04 5530 0
653 의료/건강임신 불안해서요... 10 세이밥누님 15/12/22 5531 0
3932 게임비취 드루 할 때 멀리건은 어떻게 하나요? 3 Toby 18/01/03 5531 0
6930 연애이별 후유증 다들어떻게 극복하시나요? 22 혼수상태 19/04/11 5531 0
9722 여행코엑스 또는 삼성동 주변 맛집 추천 17 DogSound-_-* 20/07/06 5531 0
10582 IT/컴퓨터컴퓨터 구매 질문입니다. 7 Darwin4078 20/12/09 5531 0
3063 IT/컴퓨터프로그래밍에 전혀 사전지식이 없는 5 二ッキョウ니쿄 17/07/17 5532 0
7974 IT/컴퓨터c++ 에서 unordered map을 pair를 key로 사용할 때 순회 7 kaestro 19/10/03 5532 0
8639 기타바이킹스워프 이용 노하우 전수 부탁드립니다. 7 호타루 20/01/17 5532 0
10467 의료/건강자살에 대해 어떻게 생각하시나요? 31 [익명] 20/11/18 5532 0
1902 가정/육아피톤치드 꼭 해야 되나요? 4 허허허 16/12/13 5533 0
목록

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

댓글