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


목록
번호 제목 이름 날짜 조회 추천
4075 의료/건강서울에 심리상담 추천해주실 만한 곳 있을까요? 4 [익명] 18/01/29 5428 1
6930 연애이별 후유증 다들어떻게 극복하시나요? 22 혼수상태 19/04/11 5428 0
13011 IT/컴퓨터구글캘린더 내역이 사라졌어요... 3 성혜 22/02/22 5428 0
13567 게임뱅리건 역대급 함성 영상을 찾습니다. 메타휴먼 22/07/01 5428 0
7507 IT/컴퓨터[엑셀] 교수님들 질문 있습니다. 4 HeatWade 19/07/22 5427 0
8109 의료/건강워터픽쓰시는분 계신가요?? 6 장자 19/10/26 5427 0
9171 법률연차 질문입니다. 6 원영사랑 20/04/13 5427 0
11347 기타페이크삭스 신고 신발신었더니 뒤꿈치쪽이 10분만에 까졌어요... 6 John Petrucci 21/04/14 5427 0
13715 IT/컴퓨터M1 iMac Touch ID가 있었는데요.. 없었습니다 6 보이차 22/08/05 5427 0
1088 게임믿음직하다는 형용사를 인간에게 쓸 수 있던가? 8 행복한사람 16/05/18 5426 0
2459 의료/건강비듬이 많습니다. 22 에밀 17/03/08 5426 1
3381 가정/육아추석때 장거리 뛸 예정입니다. 홍차넷 슈마허님들의 고견을 듣고자 합니다. 29 SCV 17/09/18 5426 0
7324 IT/컴퓨터아이폰에서 아크로벳 리더 연결이 안돼요 ㅠㅠ 6 다람쥐 19/06/16 5426 0
9722 여행코엑스 또는 삼성동 주변 맛집 추천 17 DogSound-_-* 20/07/06 5426 0
9860 의료/건강코로나 확진이 3월에 되서 지금은 호전된 분을 만나도 상관없을까요? 8 태정이 20/07/31 5426 1
10665 IT/컴퓨터스마트폰 - 모니터 연결 질문입니다. 3 불타는밀밭 20/12/20 5426 0
14921 기타유학생 선물 추천 부탁드립니다. 5 Coffee1 23/06/12 5426 0
997 교육논문 읽기와 쓰기 관련 질문 12 하늘밑푸른초원 16/04/14 5425 0
4128 기타2년간 정신과 시간의 방을 추천해주세요. 상품있... 64 CONTAXS2 18/02/09 5425 0
5264 기타동글이(블루투스 수송신기)은 어떤 제품이 괜찮을지요...? 6 홍당무 18/08/15 5425 0
10569 게임바둑 사활 기초부터 배울수 있는 앱 추천 부탁드려요~ 7 아침커피 20/12/07 5425 0
11728 과학대협의 존성대명을 여쭙습니다 9 私律 21/06/14 5425 0
2995 의료/건강'침습성'의 정의에 대해 4 작은 아무무 17/07/02 5424 0
9459 의료/건강심장 검사는 어디로 가야하나요? 8 거소 20/05/21 5424 0
14653 IT/컴퓨터로컬 환경에서 주피터랩 실행시 13 Profit 23/03/31 5424 0
목록

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

댓글