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


목록
번호 제목 이름 날짜 조회 추천
7980 IT/컴퓨터갤럭시 폴드 자성 질문입니다. Might 19/10/04 3341 0
7979 IT/컴퓨터홍차넷에 맥북 쓰시는 분 계신가요? 9 한신 19/10/04 4415 0
7977 IT/컴퓨터갤럭시 와이드 3 vs. V20 9 매일이수수께끼상자 19/10/04 3879 0
7975 IT/컴퓨터미국 사는 사람들은 채용공고를 어디서 보나요? 8 [익명] 19/10/04 2661 0
7974 IT/컴퓨터c++ 에서 unordered map을 pair를 key로 사용할 때 순회 7 kaestro 19/10/03 4307 0
7961 IT/컴퓨터구버전 gcc에서 vector initialization 5 kaestro 19/09/30 2899 0
7959 IT/컴퓨터코딩 공부를 시작하려고 합니다. 7 [익명] 19/09/30 2716 0
7949 IT/컴퓨터위디스크 운영은 적법한가요? 1 불타는밀밭 19/09/29 2952 0
7943 IT/컴퓨터리튬인산철 배터리 현황이 궁금합니다. 6 메존일각 19/09/29 3036 0
7939 IT/컴퓨터윈도우10 구매 관련 3 잘살자 19/09/28 3753 0
7933 IT/컴퓨터인터넷 속도 관련해서 질문 드립니다. 2 [익명] 19/09/27 2171 0
7930 IT/컴퓨터컴퓨터 견적 문의드립니다. 6 The xian 19/09/26 3062 0
7923 IT/컴퓨터페이스북에서 문자가 왔는데 이게 뭘까요? 6 오리꽥 19/09/25 4122 0
7913 IT/컴퓨터휴대폰 관련 문의드립니다 1 별이돌이 19/09/24 3241 0
7907 IT/컴퓨터카톡만 되는 폰이 있을까요? 9 [익명] 19/09/23 3900 0
7893 IT/컴퓨터컴퓨터 메인보드 및 CPU 교체와 윈도우 구매 필요 여부에 대한 질문입니다. 6 빠독이 19/09/20 3314 0
7892 IT/컴퓨터애플 워치 3 지금 사도 괜찮을까요? 13 소노다 우미 19/09/20 3651 0
7853 IT/컴퓨터아이폰11 어떻게 살 수 있나요? 2 [익명] 19/09/13 2434 0
7837 IT/컴퓨터알리익스프레스, 카드 결제 에러 3 조선전자오락단 19/09/10 15370 0
7814 IT/컴퓨터노트북 세척 7 한겨울 19/09/05 3434 0
7802 IT/컴퓨터마우스가 이상합니다. 4 사나남편 19/09/04 3924 0
7793 IT/컴퓨터블루투스 이어폰 질문입니다. Darwin4078 19/09/02 3039 0
7770 IT/컴퓨터영상편집 툴에 관해 질문드립다. 8 소원의항구 19/08/30 3478 0
7767 IT/컴퓨터손상된 HDD 데이터 복구 조언 부탁드립니다 8 기아트윈스 19/08/29 4406 0
7761 IT/컴퓨터PC를 맞추려 하는데 어느 정도 사양이 좋을까요. 6 19/08/28 2995 0
목록

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

댓글