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


목록
번호 제목 이름 날짜 조회 추천
9999 IT/컴퓨터작업표시줄 복제 문제 4 업무일지 20/08/25 5827 0
1251 의료/건강심리상담을 받아보고 싶습니다. 19 행복한사람 16/07/01 5826 0
7915 의료/건강신약 시험에서 위약실험을 하는 이유는 뭔가요? 23 토비 19/09/24 5826 0
9329 기타지하철 1호선 관련한 의문점 6 윤지호 20/05/04 5826 0
12084 기타미국산 소고기 인터넷으로 주문할만한 곳 아시나요? 10 여우아빠 21/08/19 5826 0
12220 IT/컴퓨터구글 문서, 구글 드라이브 복구 질문 swoonng 21/09/08 5826 0
12202 IT/컴퓨터시작표시줄 실행이 안됩니다. 8 Jazz 21/09/06 5826 0
12972 IT/컴퓨터컴퓨터 이상한 증상 5 헬리제의우울 22/02/14 5826 0
4307 IT/컴퓨터컴퓨터 글꼴이 이상해졌습니다. 7 naru 18/03/20 5825 0
9654 기타요녀석은 어떤 녀석인가요?(벌레, 곤충 주의) 6 shadowtaki 20/06/23 5825 0
10424 기타와플메이커 쓰시는분들 추천부탁드려요! 1 쉬군 20/11/10 5825 0
11810 의료/건강해열제↔진통제?? 11 매뉴물있뉴 21/06/30 5825 0
11941 게임게임 오버쿡! 해보신 분 계신가요? 4 벚문 21/07/25 5825 0
13577 댓글잠금 교육21년 7급 공무원 공채 논리 문제 풀이입니다. 6 [익명] 22/07/04 5825 0
1657 기타10명 내외의 모임장소 추천 5 레이드 16/10/16 5824 0
4651 기타한국의 페미니즘은 어떤 형태가 바람직했을까요? 29 [익명] 18/05/17 5824 0
7974 IT/컴퓨터c++ 에서 unordered map을 pair를 key로 사용할 때 순회 7 kaestro 19/10/03 5824 0
13080 기타해외에 있는 가족에게 물건 보낼 때 관세를 내야 하는지요..? 3 홍당무 22/03/09 5824 0
3047 의료/건강비타민D 과잉 섭취에 따른 부작용?? 6 다람쥐 17/07/13 5823 0
10365 기타착하고 순해보이는 인상은 무시당하나요? 7 [익명] 20/11/01 5823 0
10751 기타사람을 멀리하는 법 17 [익명] 21/01/02 5823 0
10814 IT/컴퓨터윈도우 업데이트 후 블루스크린 Igdkmd64.sys 2 [익명] 21/01/12 5823 0
12209 IT/컴퓨터책상 추천 부탁드려요~ 4 2막4장 21/09/07 5823 0
430 IT/컴퓨터공유기 질문 드립니다. 7 솔지은 15/11/07 5822 0
4933 기타제가 무조건 이해를 해야하는 부분인가요? 33 [익명] 18/07/01 5822 0
목록

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