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


목록
번호 제목 이름 날짜 조회 추천
3908 IT/컴퓨터아무래도 데스크탑이 필요할까요? 9 소맥술사 17/12/26 5743 0
7311 기타유효기간 지난 백화점상품권 사용유무? 4 오리꽥 19/06/14 5743 0
7974 IT/컴퓨터c++ 에서 unordered map을 pair를 key로 사용할 때 순회 7 kaestro 19/10/03 5743 0
13011 IT/컴퓨터구글캘린더 내역이 사라졌어요... 3 성혜 22/02/22 5743 0
13460 진로영어 공부는 어찌하는 걸까요?? 27 [익명] 22/06/07 5743 0
13725 법률공공입찰 서류제출관련 질문드립니다 7 헬리제의우울 22/08/08 5743 0
1641 과학이슬람 과학을 유럽 과학이 추월한 것에 대해서 질문 32 Ben사랑 16/10/12 5741 0
12180 경제원룸이 경매에 넘어갔읍니다 ㅠ 10 DogSound-_-* 21/09/02 5741 0
14722 과학생연어 비린내 없애는 비법 좀 알려주실분 ㅠㅜ 3 mathematicgirl 23/04/22 5741 0
183 게임하스스톤 전설 제작 5 레이드 15/07/24 5740 0
3502 IT/컴퓨터TV로 4k 영상을 원활하게 감상하고 싶습니다 2 별빛 17/10/13 5740 0
9329 기타지하철 1호선 관련한 의문점 6 윤지호 20/05/04 5740 0
9781 연애애프터 어디로.. 12 테스 20/07/17 5740 0
12415 기타미국놀이 이름 2 moqq 21/10/12 5740 0
12491 IT/컴퓨터"메타버스" 트렌드에 대한 의문 26 아마존 21/10/29 5740 0
98 기타3류CF라는 사이트기억하세요? 3 안녕하셈 15/06/22 5739 0
935 의료/건강. 18 사나운나비 16/03/22 5739 0
1657 기타10명 내외의 모임장소 추천 5 레이드 16/10/16 5739 0
2367 IT/컴퓨터코디 애드온이 도대체 뭔가요?ㅂ.ㅂ 우왕굳 17/02/20 5739 0
5866 과학홀로그램은 어떻게 바닥에 반사되는가 6 풉키풉키 18/11/10 5739 0
6961 연애400일 선물 뭐할까요? 24 [익명] 19/04/16 5739 0
7886 가정/육아신혼집에 있으면 좋은데 막상 살라면 까먹을법한 소모품 뭐있을까요 22 Jace.WoM 19/09/18 5739 0
10046 가정/육아생크림 유통기한이요 8 [익명] 20/09/02 5739 0
13118 기타자동차보험 질문입니다 4 김치찌개 22/03/16 5739 0
9914 진로회사 높으신 분이 계속 연애를 권합니다 21 [익명] 20/08/10 5738 0
목록

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

댓글