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


목록
번호 제목 이름 날짜 조회 추천
1485 IT/컴퓨터사무자동화 산업기사 필기공부 방법좀 알려주세요~ 4 bee 16/09/07 5449 0
1168 의료/건강의학 커뮤니티에 프로스카 복용 질문드립니다. 5 1숭2 16/06/07 5449 0
8471 의료/건강목젖이 엄청나게 부었습니다.. 8 멜로 19/12/14 5449 0
12342 기타아침식사를 직장으로 배달시켜 먹으려고 합니다. 11 거위너구리 21/09/29 5449 0
13459 과학경도 관련 질문입니다. 10 메가두따 22/06/06 5449 1
13624 기타잘모르는 분과 영화 보러 가기로 했습니다. 44 활활태워라 22/07/14 5449 1
4221 IT/컴퓨터카카오톡 친구목록 숨김 1 [익명] 18/03/01 5448 0
7974 IT/컴퓨터c++ 에서 unordered map을 pair를 key로 사용할 때 순회 7 kaestro 19/10/03 5448 0
12856 기타이재명vs윤석열 19 soulless 22/01/19 5448 0
13358 기타좌우반전된 제 모습을 보려면 어떻게 해야 할지요...? 7 홍당무 22/05/11 5448 0
13622 의료/건강B형간염 6개월 정기검진 병원 선택에 관해서 질문드립니다 6 Uhfu 22/07/12 5448 0
7794 가정/육아집에 세면대 하수구가 막혔읍니다. 14 사나남편 19/09/02 5447 0
11686 의료/건강헌혈 후 코로나 백신을 맞아도 괜찮을까요? Alicehavelock 21/06/08 5447 0
6256 여행가장 무난한 아이동반 해외여행지가 어디일까요? 26 미스터주 19/01/08 5446 0
6657 IT/컴퓨터특정 사이트 정보를 구글 시트로 가져오려고 합니다. 5 소원의항구 19/02/26 5446 0
11529 IT/컴퓨터인터넷 속도 - 라우터를 하나 늘렸더니 속도가 줄었어요 2 매뉴물있뉴 21/05/13 5446 0
11816 IT/컴퓨터메모장에서 특정 단어를 특전 단어로 바꾸는 기능이 있나요? 3 오리꽥 21/07/01 5446 0
7304 기타기초적인 비즈니스 영어 확인 부탁드려도 될까요?.. 4 [익명] 19/06/13 5445 0
7223 기타치킨스톡, 비프스톡 추천해주세요. 3 naru 19/06/01 5445 0
8078 문화/예술남자 패션 멋있게 나오는 영화/드라마 있을까요? 13 Fate 19/10/20 5445 0
8554 여행포항 맛집 추천부탁드립니다. 9 야근하는밤비 19/12/28 5445 0
12764 의료/건강수면제 복용에 관한 질문입니다. 2 불타는밀밭 21/12/30 5445 0
13888 기타이 물통 세척방법 좀 알려주십시오 21 설탕 22/09/18 5445 0
9475 철학/종교종교색 없이 명상을 배울 수 있는 데가 있을까요? 4 불타는밀밭 20/05/24 5444 0
5249 기타안경테 디자인 예쁜 가게 찾습니다. 6 지금여기 18/08/13 5443 2
목록

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

댓글