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


목록
번호 제목 이름 날짜 조회 추천
공지 질문 게시판 이용 규정 11 토비 15/06/19 22717 4
15819 문화/예술5월 4일(토)에 수족관에 간다면 인파가 얼마나 몰릴까요? 3 열한시육분 24/05/02 225 0
15818 IT/컴퓨터네이버블로그/네이버카페/인스타그램/페이스북/링크드인 모와보기? 4 + 루키루키 24/05/02 172 0
15817 의료/건강ADHD 해외파견 10 [익명] 24/04/30 510 0
15815 체육/스포츠격투기 운동을 시작해볼까 하는데 조언 부탁드립니다. 18 삼유인생 24/04/30 391 0
15814 IT/컴퓨터챗gpt같은 걸 써보고 싶은데, 추천부탁드립니다. 10 똘빼 24/04/29 448 0
15813 의료/건강응급실 질문입니다. 3 kogang2001 24/04/29 439 0
15812 가정/육아아이 학원을 어떻게 알아보는게 좋을까요? 6 토비 24/04/29 427 0
15811 IT/컴퓨터중고 크롬북을 사고 싶은데 마땅한 이유가 없읍니다 14 아침커피 24/04/29 333 0
15810 법률자진퇴사/권고사직/실업급여문의입니다. 8 [익명] 24/04/29 319 0
15809 기타초콜릿에서 방구냄새가 납니다 6 2024 24/04/29 321 0
15808 가정/육아선입선출 수납박스 20 kaestro 24/04/29 532 0
15807 경제퇴직금 계좌 전환 관련하여 문의드립니다. 2 거참귀찮네 24/04/29 227 0
15806 IT/컴퓨터5만원 미만 스마트워치? 7 기아트윈스 24/04/28 323 0
15805 IT/컴퓨터usb 포트 늘리는 물건 추천해주실수 있을까요? 6 kaestro 24/04/28 396 0
15804 의료/건강CRP수치가 높으면 많이 위험한가요?? 2 Broccoli 24/04/28 390 0
15803 의료/건강해외 유학 전 검강검진 + 예방접종 질문드립니다. 6 귤깐손 24/04/27 363 0
15802 문화/예술이슬람 노래 찾습니다 1 몸맘 24/04/27 218 0
15800 의료/건강간염 예방접종 질문입니다. 2 kogang2001 24/04/26 225 0
15799 IT/컴퓨터크롬캐스트4세대로 넷플릭스 광고요금제 볼수 있나요? 일리지 24/04/26 201 0
15798 여행제주 여행 질문입니다 6 거소 24/04/26 303 0
15797 법률상속포기 관련 9 [익명] 24/04/25 556 0
15796 IT/컴퓨터가계부앱 질문 1 whenyouinRome... 24/04/25 205 0
15795 기타혹시 일렉기타에서 팔 붕붕 휘두르면서 퍼포먼스 하는거 뭐라고 부르는지 아실까요? 2 즐겁게 24/04/24 551 0
15794 게임오게임, 부족전쟁이 그렇게 재미있었나요? 12 2024 24/04/23 652 0
목록

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

댓글