안녕하세요 엘체프 임돠

오늘은 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;
}


+ Recent posts