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


목록
번호 제목 이름 날짜 조회 추천
2666 기타band 데이터 세이브 요금제 잘 아시는분 계신가요? 2 하드코어 17/04/15 5520 0
14659 기타BBQ를 맛있게 못하겠습니다 ㅠㅜ 4 ㅢㅘㅞ 23/04/03 2346 0
14347 기타BHC 치킨 질문입니다 7 김치찌개 23/01/08 1965 0
774 IT/컴퓨터Binary search tree 문제 6 kpark 16/01/25 6906 0
12493 경제BJ 후원을 주식 처럼 할 수 있는 플랫폼 어떨까요? 9 INFJ 21/10/31 3373 0
2193 교육Bless you 있잖아요. 4 은머리 17/01/27 3331 0
13248 의료/건강BMI30.2-30대후반-여성, 위소매절제술 여쭙습니다. 12 [익명] 22/04/14 4020 0
5998 의료/건강brain MRI 보험여부 질문드립니다. 3 [익명] 18/11/30 2394 0
9742 철학/종교BTS는 악마의 표징, 블랙핑크는 악마숭배, 겨울왕국2는 동성애를 장려한다고 자꾸 그러네요 42 [익명] 20/07/10 5892 0
7068 문화/예술Bts의 군면제 이슈에 대해서 어떻게 보십니까? 26 방사능홍차 19/05/06 3248 0
491 기타BW에 대해 궁금한점이 있습니다. 2 수박이두통에게보린 15/11/17 2724 0
1384 의료/건강b형 간염 예방 백신을 맞아야하는데 간수치 높으면 안 되나요? 1 베스트F 16/08/06 6560 0
10401 의료/건강B형 간염 예방주사 관련 9 꿀래디에이터 20/11/06 3433 0
13622 의료/건강B형간염 6개월 정기검진 병원 선택에 관해서 질문드립니다 6 Uhfu 22/07/12 3100 0
11045 의료/건강B형간염 있는 사람이 우벤자임 영양제 먹어도 괜찮나요? 2 Uhfu 21/02/15 3933 0
14712 IT/컴퓨터C, C++ 개발자가 적은 이유가 무엇인가요? 11 아침커피 23/04/18 3895 0
3156 IT/컴퓨터c++ 공부 하는데 얼마정도 걸리나요? 6 지식의늪지대 17/08/06 7908 0
7974 IT/컴퓨터c++ 에서 unordered map을 pair를 key로 사용할 때 순회 7 kaestro 19/10/03 4306 0
8492 의료/건강CA 19-9 수치 검사를 건강검진에 사용하는 이유 등에 대해서 5 [익명] 19/12/17 5178 0
10121 경제CBDC를 발행하면 마이너스 금리 부과 가능하다는데... 2 [익명] 20/09/15 2630 0
10191 IT/컴퓨터CCTV 설치 쉬운가요? 7 덕후나이트 20/09/30 3945 0
2304 IT/컴퓨터cd -> mp3 변환 방법 질문입니다. 5 줄리엣 17/02/13 2719 0
6261 기타CD 굽기 질문입니다 8 김치찌개 19/01/09 2419 0
2307 IT/컴퓨터cd 데이터 살릴 방법 없을까요? 8 줄리엣 17/02/13 2751 0
11152 IT/컴퓨터CD-ROM 이 급하게 필요합니다. 17 요일3장18절 21/03/08 7020 0
목록

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

댓글