목차

     

     


     

    [백준 10814번 C/C++] 나이순 정렬

     

    https://www.acmicpc.net/problem/10814

     

    10814번: 나이순 정렬

    온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을

    www.acmicpc.net


     

     

    해결전략

     

    vector에 구조체 변수(struct Tag)를 넣은 후 정렬한다. 이 때 bool Compare 함수를 만들어 원하는 모양으로 정렬해준다.

     

    주의할점

    • vector<Tag> v에 값을 넣어줄 때는
    • v.push_back( Tag { 값1, 값2, 값3 } ) 과 같은 모양으로 넣어줘야 한다.
      • Tag 뒤의 값들은 중괄호 { }를 사용해서 넣어주어야 한다.

     


     

    코드

     

    #include <iostream>
    #include <string>
    #include <vector>
    #include <algorithm>
    using namespace std;
    
    struct Tag
    {
    	int age;
    	string name;
    	int joinOrder;
    };
    
    bool Compare(const Tag& a, const Tag& b)
    {
    	if (a.age == b.age)
    		return a.joinOrder < b.joinOrder;
    
    	return a.age < b.age;
    }
    
    int main(){
    	ios::sync_with_stdio(false);
    	cin.tie(NULL);
    	cout.tie(NULL);
    	int n;
    	cin >> n;
    
    	vector<Tag> v(n);
    
    	for (int i = 0; i < n; i++) {
    		cin >> v[i].age >> v[i].name;
    		v[i].joinOrder = i;
    	}
    
    	sort(v.begin(), v.end(), Compare);
    
    	for (int i = 0; i < n; i++) {
    		cout << v[i].age << " " << v[i].name << "\n";
    	}
    
    	return 0;
    }

     

     


     

    주의사항) 입력방법에 따라 vector 사이즈를 미리 할당해야 하는 경우가 있다.

     

    입력방법 1.

    vector<Tag> v;//전방 선언
    
    int main(){
    	//...
        v. reserve(n);//vector 사이즈를 할당
        for (int i = 0; i < n; i++) {
            cin >> v[i].age >> v[i].name;
            v[i].joinOrder = i;
        }
        //...
    }
    • 위의 경우 입력 시 v[ i ]의 형태로 입력을 받는다. 따라서 vector의 사이즈를 제대로 할당하지 않으면 입력 시 문제가 된다.

     

     

     

    입력방법 2.

    vector<Tag> v;//전방 선언
    
    int main(){
    	//...
    	for (int i = 0; i < n; i++) {
    		int a;
    		string b;
    		cin >> a >> b;
    		v.push_back(Tag{ a, b, i });
    	}
        //...
    }
    • 입력방법1과 달리 입력방법2에서는 push_back을 사용하였다. push_back을 사용하면 데이터를 밀어 넣으면서 메모리가 할당되니 굳이 vector 사이즈를 미리 할당할 필요가 없다.

     


     

     

    입력방법2를 사용한 코드

     

    #include <iostream>
    #include <string>
    #include <vector>
    #include <algorithm>
    using namespace std;
    
    struct Tag
    {
    	int age;
    	string name;
    	int joinOrder;
    };
    
    bool Compare(const Tag& a, const Tag& b)
    {
    	if (a.age == b.age)
    		return a.joinOrder < b.joinOrder;
    
    	return a.age < b.age;
    }
    
    vector<Tag> v;
    
    int main(){
    	ios::sync_with_stdio(false);
    	cin.tie(NULL);
    	cout.tie(NULL);
    	int n;
    	cin >> n;
    
    	for (int i = 0; i < n; i++) {
    		int a;
    		string b;
    		cin >> a >> b;
    		v.push_back(Tag{ a, b, i });
    	}
    
    	sort(v.begin(), v.end(), Compare);
    
    	for (const auto& it : v) {
    		cout << it.age << " " << it.name << "\n";
    	}
    
    	return 0;
    }

     

     


     

     

    다른 방법의 풀이

     

    #include <iostream>
    #include <string>
    #include <vector>
    #include <map>
    using namespace std;
    
    map<int, vector<string>> myMap;
    
    int main(void){
    	ios::sync_with_stdio(false);
    	cin.tie(NULL);
    	cout.tie(NULL);
    	int n, age;
    	string name;
    	cin >> n;
    
    	for (int i = 0; i < n; i++)
    	{
    		cin >> age >> name;
    		myMap[age].push_back(name);
    	}
    
    	for (auto& it : myMap)
    	{
    		for (auto i : it.second)
    		{
    			cout << it.first << " " << i << "\n";
    		}
    	}
    
    	return 0;
    }

     

    map을 사용한 방법의 풀이다.