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


목록
번호 제목 이름 날짜 조회 추천
8245 여행대만, 1월, 여기는 꼭 가봐야 한다는 곳이 있다면? 13 CaScade 19/11/12 4118 0
8242 IT/컴퓨터VPN 앱을 실행하면 와이파이가 끊어집니다. 4 Schweigen 19/11/12 5553 0
8240 여행결혼 25주년 기념 여행을 준비해야 합니다. (부모님) 33 CaScade 19/11/11 4016 0
8204 IT/컴퓨터프로그램/시스템 개발 문의 10 SCV 19/11/06 4187 0
8174 IT/컴퓨터컴알못의 조립 pc 견적입니다. 6 Suica28 19/11/02 4047 0
8155 철학/종교신뢰란 무엇일까요? 18 AGuyWithGlaSSeS 19/10/30 5728 0
8147 게임위쳐3 70% 할인하는데.... 8 CaScade 19/10/30 5313 0
8114 기타로고디자인 계약(?)질문드려요 2 Skkjune 19/10/26 3632 0
8089 기타자차보험을 통한 자동차 수리 절차 7 AeSop 19/10/22 6950 1
8062 교육함께 스터디를 하는 방법, 문제집 없이 공부하는 방법 12 kaeStro 19/10/17 4687 0
8042 IT/컴퓨터애플펜슬 공식숍 vs 네이버 구매처들 4 kaeStro 19/10/14 4594 0
8036 여행홍차넷이 추천하는 홍차 카페 15 MoleSkin 19/10/14 4443 0
8032 IT/컴퓨터애플펜슬 구매, pdf 읽을 때 필요할까요 13 kaeStro 19/10/13 4497 0
7997 기타동종업계 이직금지 조항, 외국에도 있나요? 31 kaeStro 19/10/07 9197 0
7974 IT/컴퓨터c++ 에서 unordered map을 pair를 key로 사용할 때 순회 7 kaeStro 19/10/03 5482 0
7961 IT/컴퓨터구버전 gcc에서 vector initialization 5 kaeStro 19/09/30 3846 0
7951 기타외국에서 오래 거주하다가 잠시 한국에 들를 때 휴대폰 어떻게 해야할까요? 3 droySen 19/09/29 5529 0
7920 기타 카페 인테리어 대략적인 비용이 어느 정도 들까요? 8 Swear 19/09/25 5221 0
7917 기타이거 피싱? 스미싱? 문자 맞나요? 3 ArcanumToSS 19/09/24 10595 0
7888 체육/스포츠스노우보드셑트를 사고 싶읍니다. 8 DogSound-_-* 19/09/18 4091 0
7881 기타멜로디 매거진이라고 들어보신분 있나요? 11 FSM 19/09/17 7691 0
7875 기타사람을 만나고 싶은데 방법을 모르겠습니다. 28 kaeStro 19/09/17 4721 1
7868 기타간단한(?) 문법 질문 7 LemonduckS 19/09/16 3260 0
7839 문화/예술코미디 미드 추천 받습니다. 22 MoleSkin 19/09/10 5625 0
7832 기타윤석열 검사 관련 기사인데 이 사건이 어떻게 마무리됐는지 아시는 분 계시나요? 2 ArcanumToSS 19/09/09 4833 0
목록

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

댓글