- 질문 게시판입니다.
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 5530 0
5609 문화/예술소설 하나를 애타게 찾고 있습니다 27 문학소녀 18/10/07 5530 0
8639 기타바이킹스워프 이용 노하우 전수 부탁드립니다. 7 호타루 20/01/17 5530 0
9056 가정/육아꽃바구니 배달 어디 이용하시나요? 2 빈둥 20/03/24 5530 0
5634 교육영어 전치사 사용예 모음집이나 롸이팅교재? 추천해주세요 11 la fleur 18/10/11 5531 0
7974 IT/컴퓨터c++ 에서 unordered map을 pair를 key로 사용할 때 순회 7 kaestro 19/10/03 5531 0
9860 의료/건강코로나 확진이 3월에 되서 지금은 호전된 분을 만나도 상관없을까요? 8 태정이 20/07/31 5531 1
10467 의료/건강자살에 대해 어떻게 생각하시나요? 31 [익명] 20/11/18 5531 0
12764 의료/건강수면제 복용에 관한 질문입니다. 2 불타는밀밭 21/12/30 5531 0
13908 가정/육아혹시 제 계좌에 있는 달러로 아마존 결제하는 방법이 있을까요? 8 22/09/24 5531 0
659 IT/컴퓨터전자책 추천해주세요. 11 darwin4078 15/12/23 5532 0
3063 IT/컴퓨터프로그래밍에 전혀 사전지식이 없는 5 二ッキョウ니쿄 17/07/17 5532 0
7193 철학/종교기독교인들의 '방언' 현상에 대하여... 13 경제학도123 19/05/25 5532 0
8414 여행군산 시내 호텔 5 FSM 19/12/05 5532 0
14026 IT/컴퓨터안드로이드폰 동영상 촬영시 날짜시간표시 2 21700 22/10/20 5532 0
3462 체육/스포츠스포츠 경기를 생방으로 안본이에게 경기결과 알려주는건 스포인가요? 16 유리소년 17/10/04 5533 1
4915 연애소개팅을 가면 무슨 이야기를 하나요...? 21 tunetherainbow 18/06/27 5533 0
12404 의료/건강백신 비접종자에 대한 불편함 부여에 대한 생각 3 알겠슘돠 21/10/09 5533 0
129 기타유승민 명예퇴진? 15 세계구조 15/06/30 5534 0
2414 IT/컴퓨터 좋은 보안 프로그램에는 무엇이 있을까요? 12 우분투 17/02/26 5534 0
5223 과학수경재배 관련해서 질문 드립니다 8 보리건빵 18/08/09 5534 0
9141 기타호의를 권리인줄 착각하는 사람한테는 어떻게 대응해야할까요? 17 ar15Lover 20/04/07 5534 0
9171 법률연차 질문입니다. 6 원영사랑 20/04/13 5534 0
12057 의료/건강안구건조증 치료 방법에 대해서 질문 드려요 10 말하는감자 21/08/16 5534 0
12177 경제주택청약통장 연체 일시납 질문입니다. 3 Jack Bogle 21/09/02 5534 0
목록

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

댓글