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


목록
번호 제목 이름 날짜 조회 추천
8188 IT/컴퓨터튼튼한 휴대폰 케이스 질문입니다 8 고철 19/11/04 4141 0
8180 IT/컴퓨터MACBook pro 17년 상반기 형에 부트캠프에서.. 3 mathematicgirl 19/11/03 5154 0
8174 IT/컴퓨터컴알못의 조립 pc 견적입니다. 6 Suica28 19/11/02 3970 0
8169 IT/컴퓨터타블렛 pc 추천 좀 해주십사... 6 데스꽁치 19/11/01 3955 0
8166 IT/컴퓨터작업용 노트북 한 번만 봐주십시오. 2 메존일각 19/11/01 3481 0
8164 IT/컴퓨터안드로이드 폰을 컴퓨터에서 작동시키려면..?? 7 grey 19/10/31 4289 0
8148 IT/컴퓨터엑셀에서 클릭해줘야만 수식적용이 될 때 어떻게 하면 될까요?_해결! 4 오늘 19/10/30 5362 0
8139 IT/컴퓨터구글 계정별로 이름을 다르게 설정할 수 있나요? 7 자공진 19/10/29 4638 0
8123 IT/컴퓨터쇼핑몰 제작 의뢰를 받았습니다. 18 [익명] 19/10/27 3556 0
8121 IT/컴퓨터컴퓨터가 며칠전부터.. 5 김독자 19/10/27 4769 0
8116 IT/컴퓨터컴퓨터 부팅이 안돼요! 4 알료사 19/10/27 3975 0
8111 IT/컴퓨터음향장비 질문 우디르 19/10/26 4029 0
8110 IT/컴퓨터캘린더(+ 할 일) 어플 추천 부탁드려요. 3 소반 19/10/26 4660 0
8102 IT/컴퓨터아이폰인데, 이상한 전화가 하루에도 수십 통씩 옵니다 9 [익명] 19/10/24 5719 0
8080 IT/컴퓨터유심을 다른 기기에 끼우는 것 관련 17 치유 19/10/20 5374 0
8058 IT/컴퓨터아이패드미니5 위치 정확도 WIFI연결 팝업 안뜨게하는 방법이 있나요? 야근하는밤비 19/10/17 4567 0
8057 IT/컴퓨터테라 용량 usb를 구입하려고 하는데요 9 [익명] 19/10/16 10092 0
8049 IT/컴퓨터(블루투스) 스피커 고수분들! 1 박태 19/10/15 4618 0
8042 IT/컴퓨터애플펜슬 공식숍 vs 네이버 구매처들 4 kaestro 19/10/14 4525 0
8041 IT/컴퓨터아이폰 11 사전예약 가능 사이트 또는 점포 추천 부탁 드립니다. 6 The xian 19/10/14 4697 0
8037 IT/컴퓨터[핸드폰] 음질 좋다는 핸폰은, 어느 정도나 좋은 건가요? 1 매일이수수께끼상자 19/10/14 4823 0
8032 IT/컴퓨터애플펜슬 구매, pdf 읽을 때 필요할까요 13 kaestro 19/10/13 4427 0
8026 IT/컴퓨터유튜브 요약 정보를 볼 수 있는 사이트가 있을까요? 6 김독자 19/10/12 4382 0
8023 IT/컴퓨터핸드폰으로 찍은 사진이나 동영상을 컴퓨터로 빨리 옮기는 방법이 있을지요...? 7 [익명] 19/10/12 3972 0
8014 IT/컴퓨터VR기기를 체험하고 싶습니다. 8 불타는밀밭 19/10/11 3703 0
목록

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

댓글