안녕하세요 엘체프 임돠
오늘은 map으로 정렬하는 문제로 map을 이해 해보도록 하겠습니다.
참고 링크) multimap 과 map의 차이점
: http://blog.daum.net/coolprogramming/83
문) 영화 목록을 아래와 같이 오름차순 정렬하여 출력할 수 있도록 프로그램을 작성합니다.
실행화면
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | #include <iostream> #include <map> #include <string> #include <list> using namespace std; typedef multimap<int, string>::iterator year_movie_it; int findMovieYear(map<string, int> sortedMap, string movie) { int year; map<string, int>::iterator sit = sortedMap.find(movie); if (sit != sortedMap.end()) year = sit->second; return year; } int main() { multimap<int, string> year_movie_map; pair<int, string> year_movie[] = { make_pair(1998, "타이타닉"), make_pair(2008, "슬럼독 밀리어네어"), make_pair(1997, "인생은 아름다워"), make_pair(2003, "올드보이"), make_pair(1994, "라이온킹"), make_pair(1999, "매트릭스"), make_pair(1994, "포레스트검프"), }; for (int i=0 ; i<sizeof(year_movie)/sizeof(pair<int, string>) ; i++) { year_movie_map.insert(year_movie[i]); } // 문1) 정렬할 수 있도록 movieList 라는 list 클래스의 객체변수를 만듭니다. // hint) list의 구성요소는 문자열 성분이다. // 문2) 21번 라인에서 구성된 multimap에 반복자 패턴(iterator)를 결합하여 // it 라는 반복자 패턴 변수를 작성한다. // 문3) 정렬한 결과를 담을 수 있는 sortedMap이라는 // map 객체 변수를 만들어서 기존의 multimap의 내용을 key와 value를 // 반대로 뒤집어서 저장하여 정렬하도록 합니다. (참고로 아래는 문3) 세분화한 힌트입니다) // 과정-1) sortedMap map 객체 생성 // 과정-2) while문을 사용하여 문제 2에서 만든 it 반복자 패턴객체 를 이용하여 it의 키(it->first 또는 (*it).first)를 sortedMap 의 값으로 반대로 it의 값(it->second)은 sortedMap의 키로 대입 // 과정-3) 아래의 while문을 돌리기 위한 list<string>과 반복자 패턴 (iterator)가 결합된 mit 라는 변수를 생성. while (mit != movieList.end()) { sortedMap.insert(make_pair(*mit, findMovieYear(sortedMap, *mit))); mit++; } // while // 문4) 정렬된 sortedMap으로 주어진 결과와 같은 화면이 // 인쇄될 수 있도록 코드를 작성하십시오. system("PAUSE"); return 0; } |
--------------------------------------------
답안소스
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | #include <iostream> #include <map> #include <string> #include <list> using namespace std; typedef multimap<int, string>::iterator year_movie_it; int findMovieYear(map<string, int> sortedMap, string movie) { int year; map<string, int>::iterator sit = sortedMap.find(movie); if (sit != sortedMap.end()) year = sit->second; return year; } int main() { multimap<int, string> year_movie_map; pair<int, string> year_movie[] = { make_pair(1998, "타이타닉"), make_pair(2008, "슬럼독 밀리어네어"), make_pair(1997, "인생은 아름다워"), make_pair(2003, "올드보이"), make_pair(1994, "라이온킹"), make_pair(1999, "매트릭스"), make_pair(1994, "포레스트검프"), }; for (int i=0 ; i<sizeof(year_movie)/sizeof(pair<int, string>) ; i++) { year_movie_map.insert(year_movie[i]); } // 문1) 정렬할 수 있도록 movieList 라는 list 클래스의 객체변수를 만듭니다. // hint) list의 구성요소는 문자열 성분이다. list<string> movieList; // 문2) 21번 라인에서 구성된 multimap에 반복자 패턴(iterator)를 결합하여 // it 라는 반복자 패턴 변수를 작성한다. multimap<int, string>::iterator it = year_movie_map.begin(); // 문3) 정렬한 결과를 담을 수 있는 sortedMap이라는 // map 객체 변수를 만들어서 기존의 multimap의 내용을 key와 value를 // 반대로 뒤집어서 저장하여 정렬하도록 합니다. map<string, int> sortedMap; while (it != year_movie_map.end()) { sortedMap.insert(make_pair(it->second, it->first)); it++; } // while list<string>::iterator mit = movieList.begin(); while (mit != movieList.end()) { sortedMap.insert(make_pair(*mit, findMovieYear(sortedMap, *mit))); mit++; } // while // 문4) 정렬된 sortedMap으로 주어진 결과와 같은 화면이 // 인쇄될 수 있도록 코드를 작성하십시오. map<string, int>::iterator mit2 = sortedMap.begin(); while (mit2 != sortedMap.end()) { cout << mit2->first << "," << mit2->second << endl; mit2++; }// while system("PAUSE"); return 0; } |
'스터디 > C,C++' 카테고리의 다른 글
비속어 필터링(trash talk filtering) 문제 (6) | 2018.03.05 |
---|---|
C++ map을 이용한 login 문제 (6) | 2018.02.28 |
C 문자열(string) 분리 (6) | 2018.02.28 |
C 문자열(string) 바꾸기 (6) | 2018.02.28 |
마지막 C 시험문제 공백 사각찍기 (7) | 2018.02.28 |