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


목록
번호 제목 이름 날짜 조회 추천
공지 질문 게시판 이용 규정 11 토비 15/06/19 22625 4
15772 여행위탁수화물 물건 중 빼야되는 것을 골라주세요 4 + DogSound-_-* 24/04/16 102 0
15771 IT/컴퓨터요즘은 타자 연습 뭘로 할까요? 10 토비 24/04/16 222 0
15770 IT/컴퓨터모바일에서 보기 편한 스프레드시트? 4 메존일각 24/04/16 303 0
15769 가정/육아마누라 핸드폰 사용한지가 4년이 넘었읍니다. 23 허윤진남편 24/04/16 516 0
15768 문화/예술서울 교보문고 괜찮은 지점 15 + 마우스노동러 24/04/15 563 0
15767 기타화장실 제품 (변기,소변기,세면대) 고오급 브랜드?? 10 Groot 24/04/15 392 0
15765 가정/육아어머니 생일 선물... 무엇이 좋을까요? 6 휴리스틱 24/04/15 264 0
15764 법률빌려준 돈 이자 계산 3 [익명] 24/04/15 423 0
15763 과학지구상의 모든 생명체는 산소를 필요로 하는지요...? 6 홍당무 24/04/14 665 0
15762 문화/예술색소폰을 사려면 어떻게 해야할까요?? 2 유아 24/04/14 456 0
15761 IT/컴퓨터제가 운영하는 웹사이트에 error_log 파일이 쌓이고 있는데 도움부탁드립니다. 4 스톤위키 24/04/13 384 0
15760 의료/건강독세핀염산염 부작용 질문드립니다. 3 [익명] 24/04/12 310 0
15759 여행혹시 마산합포구 쪽에 차돌박이 잘하는데 있을까요? 허윤진남편 24/04/12 227 0
15758 기타이 식물 이름이 무엇일까요? 2 아재 24/04/12 352 0
15757 IT/컴퓨터TV로 파일 영상을 잘 보려면? 1 2024 24/04/11 213 0
15756 의료/건강녹내장에 관해 잘 아시는분 계실까요? 1 어둠달골짜기 24/04/11 309 0
15755 IT/컴퓨터알뜰폰 쓰는 사람이 해외여행갈때 어떻게 하면 좋을지요? 6 Broccoli 24/04/11 457 0
15754 가정/육아야외 빨래건조 어떻게 해야 하나요? 13 [익명] 24/04/10 535 0
15753 기타소비 패턴 질문입니다 17 [익명] 24/04/09 573 0
15752 IT/컴퓨터안드로이드 TV에서 DVD 파일 재생 4 OshiN 24/04/08 331 0
15751 기타개를 유모차에 넣고 다니는 이유가 궁금합니다 7 아이캔플라이 24/04/08 878 0
15750 기타자기 전까지의 시간을 어떻게 보내는게 건강할까요? 28 똘빼 24/04/07 760 0
15749 기타도로에서 뒷차가 쾅 박았습니다. 18 바방구 24/04/07 716 0
15748 법률전세 전입시 근저당 및 보증보험 인수 관련 문의 sarammy 24/04/06 248 0
목록

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

댓글