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


목록
번호 제목 이름 날짜 조회 추천
7461 기타서울에 민어회 먹으러 갈만한 곳 질문드립니다 5 안개꽃 19/07/12 4323 0
13173 의료/건강한 공간에서 숨막힘과 두려움을 느껴도 공황장애인가여 14 [익명] 22/03/28 4322 0
7345 법률근로계약서 미작성시 과태료 질문입니다.. 5 [익명] 19/06/19 4322 0
4843 기타남정네 눈썹문신 추천해주세용 1 DogSound-_-* 18/06/17 4322 0
12719 진로32세, 물리치료과 진학을 고민중입니다. 현직자님들 한마디 부탁드려요 : ) 10 씨엘로 21/12/20 4321 0
10315 IT/컴퓨터외장 하드에 랜섬웨어가 있는지 확인할 수 있나요? 8 쿠르드 20/10/23 4321 0
3616 의료/건강요즘 하품이 매우 심합니다. 5 로제바인 17/11/02 4321 0
8078 문화/예술남자 패션 멋있게 나오는 영화/드라마 있을까요? 13 Fate(Profit) 19/10/20 4320 0
5808 의료/건강만3세 아들 체중 하위2% 체질량 하위1%입니다 9 마술사 18/11/02 4320 0
2459 의료/건강비듬이 많습니다. 22 에밀 17/03/08 4320 1
1256 기타저가형 시계 추천 부탁드립니다. 6 레이드 16/07/03 4320 0
3559 체육/스포츠토요일, 정자역, 젊은 남녀 여럿, 식당 추천 바랍니다 17 레지엔 17/10/24 4319 0
13265 홍차넷홍차넷과 콩차넷의 상관관계??? 20 당나귀 22/04/19 4318 1
8669 IT/컴퓨터e북 리더기 추천 부탁드립니다. 5 A7658 20/01/23 4318 0
4006 IT/컴퓨터노트북 셋 중에 하나 고르기 (선택/질문/조사/설문) 19 Killy 18/01/15 4318 0
3908 IT/컴퓨터아무래도 데스크탑이 필요할까요? 9 소맥술사 17/12/26 4318 0
8013 기타호나우도처럼 대리모로 애를 낳는다면 어떤 인종을 선택하시겠어요? 17 쿠쿠z 19/10/11 4317 0
3785 여행대구에 목욕탕이나 스파 좋은 곳 요즘음 어디인가요? 3 Zel 17/12/03 4317 0
9208 기타유능해지고 싶습니다. 제발 도와주세요. 20 덕후나이트 20/04/18 4316 0
8945 가정/육아UV랜턴에 반응하는 물질에 대하여 2 세나개 20/03/10 4316 0
8462 의료/건강유아에게 2달여간 실온에 묵혀둔 냉장 보관 항생제를 먹였는데 괜찮을까요? 7 아재 19/12/13 4316 0
4915 연애소개팅을 가면 무슨 이야기를 하나요...? 21 tunetherainbow 18/06/27 4316 0
12713 기타부서의 성과를 어떻게 하면 잘 어필 할 수 있을까요? 6 soulless 21/12/20 4315 0
12612 의료/건강망막박리 수술 관련 병원 추천 부탁드립니다 2 와이 21/11/27 4315 0
10887 진로M자형 탈모 증세 완화에 좋은 약이 있을까요? 13 호라타래 21/01/24 4315 1
목록

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

댓글