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


목록
번호 제목 이름 날짜 조회 추천
9697 의료/건강코로나19 관련 행사 참석 금지 관련 문구 질문드립니다. 3 2020禁유튜브 20/07/01 5745 0
10080 기타친구가 절 차단 했는데 설마 이걸까요? 5 화이트카페모카 20/09/07 5745 0
12207 기타등산화, 러닝화 및 관련 커뮤니티 질문좀 드립니다~ 3 어둠달골짜기 21/09/06 5745 0
13740 IT/컴퓨터갤럭시 A시리즈 써보신 분의 경험을 듣고 싶습니다. 8 물냉과비냉사이 22/08/11 5745 0
15313 기타손목시계 배터리 교체비용 및 배터리 성능 차이 1 아침커피 23/10/25 5745 0
2186 연애이별을 몇번 경험하면 이별에 초연해지나요? 10 볼레로 17/01/26 5744 0
2555 기타결혼식 복장 어떻게 하고 가시나요? 18 그럼에도불구하고 17/03/25 5744 0
13051 기타무선마우스 질문입니다 17 김치찌개 22/03/03 5744 0
475 게임[하스스톤] 여러분이라면 어떤 전설카드를? 5 NightBAya 15/11/15 5743 0
1253 체육/스포츠지금 피파랭킹이 국가의 현재 실력을 잘 반영하고 있나요? 12 전기공학도 16/07/03 5743 0
2979 문화/예술한국에서 외국음악이 몰락한 이유가 뭔가요? 7 조홍 17/06/29 5743 0
5170 기타"-읍니다" 유행어(?)의 근원지가 어디인가요? 18 [익명] 18/07/31 5743 0
12659 의료/건강칼로리 산정 기준 10 주디 21/12/07 5743 0
13011 IT/컴퓨터구글캘린더 내역이 사라졌어요... 3 성혜 22/02/22 5743 0
13064 기타마리텔 기미작가 리액션 효과음 5 토비 22/03/06 5743 0
430 IT/컴퓨터공유기 질문 드립니다. 7 솔지은 15/11/07 5742 0
11529 IT/컴퓨터인터넷 속도 - 라우터를 하나 늘렸더니 속도가 줄었어요 2 매뉴물있뉴 21/05/13 5742 0
13725 법률공공입찰 서류제출관련 질문드립니다 7 헬리제의우울 22/08/08 5742 0
1398 문화/예술영화 'Enough Said'의 제목은 어떤 의미인가요? 5 Smiling Killy 16/08/09 5741 0
3908 IT/컴퓨터아무래도 데스크탑이 필요할까요? 9 소맥술사 17/12/26 5741 0
5808 의료/건강만3세 아들 체중 하위2% 체질량 하위1%입니다 9 마술사 18/11/02 5741 0
7974 IT/컴퓨터c++ 에서 unordered map을 pair를 key로 사용할 때 순회 7 kaestro 19/10/03 5741 0
8824 IT/컴퓨터맥vs갤럭시북vs그램 27 카야 20/02/21 5741 0
11344 기타여름철 에어컨 선택 11 지금여기 21/04/13 5741 0
12290 IT/컴퓨터[네트워크구성] 거실 Quest2 와 방안 PC 연결 10 21/09/21 5741 0
목록

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

댓글