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


목록
번호 제목 이름 날짜 조회 추천
4128 기타2년간 정신과 시간의 방을 추천해주세요. 상품있... 64 CONTAXS2 18/02/09 4281 0
7967 문화/예술드립커피 도전하려고하는데 장비 이륙해도 될까요? 31 야근하는밤비 19/10/01 4281 0
10887 진로M자형 탈모 증세 완화에 좋은 약이 있을까요? 13 호라타래 21/01/24 4281 1
12074 기타(19금) 비아그라/시알리스 효과 체감하시나요? 15 [익명] 21/08/17 4281 0
12340 IT/컴퓨터컴퓨터 부팅시 아웃오브레인지 4 치토스순한맛 21/09/29 4281 0
12665 기타아이폰11 액정이 깨졌는데 사설 수리가 가장 싸겠죠? 13 케이크 21/12/09 4281 0
2382 체육/스포츠리커브보우를 쏠 때 활을 입에 대는 이유가 뭘까요? 4 수박이두통에게보린 17/02/22 4282 0
8013 기타호나우도처럼 대리모로 애를 낳는다면 어떤 인종을 선택하시겠어요? 17 쿠쿠z 19/10/11 4283 0
7772 홍차넷랍상 소우총 추천해 주십시오. 5 맥주만땅 19/08/30 4285 0
392 IT/컴퓨터자바스크립트 관련 질문입니다. 12 얼그레이 15/10/29 4286 0
1018 기타정품토너 VS 재생토너 4 김치찌개 16/04/23 4286 0
5917 IT/컴퓨터회사 메일 백업 할 좋은 방안 아이디어 모집합니다 16 별빛 18/11/19 4286 0
10015 진로이직, 재취업 시에 도움이 될 말씀을 듣고 싶습니다. 6 seonnyseo 20/08/27 4286 0
13494 IT/컴퓨터식기세척기 자동문열림 아주 중요한가요? 18 DogSound-_-* 22/06/14 4286 0
10546 의료/건강가위 눌리는 증상에서 벗어나고 싶습니다 6 오구 20/12/03 4287 0
674 여행여자친구와 1박2일로 회먹으러 가려면 어디로 가야할까요? 14 MagnaDea 15/12/29 4288 0
5278 기타아파트 의사결정이나 동의서 웹이나 모바일로 진행 10 CIMPLE 18/08/17 4289 0
2459 의료/건강비듬이 많습니다. 22 에밀 17/03/08 4290 1
7974 IT/컴퓨터c++ 에서 unordered map을 pair를 key로 사용할 때 순회 7 kaestro 19/10/03 4290 0
11105 의료/건강발목은 덜 나았는데 운동 시작을 더 미룰 순 없고... 7 불타는밀밭 21/02/26 4290 0
13630 경제기업은행 중금채, 산업은행 산금채 상품은 예금과 비교해서 무슨 장점이 있나요? 10 레디미르 22/07/15 4290 0
7218 IT/컴퓨터시놀리지 저가 가정용 NAS 구입 질문입니다. 10 메존일각 19/06/01 4291 0
10240 의료/건강비염치료기 효과 있나요? 7 잘살자 20/10/09 4291 0
1256 기타저가형 시계 추천 부탁드립니다. 6 레이드 16/07/03 4292 0
4915 연애소개팅을 가면 무슨 이야기를 하나요...? 21 tunetherainbow 18/06/27 4292 0
목록

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

댓글