안정정렬 개념을 모른 상태에서 접근했다가 살짝 헤맨 문제이다 ㅜ

그래서 정렬 안하고 푸는 방법도 소개한다! (참고로 이게 두 배 더 빠른 알고리즘이다.)

 

시간 제한 메모리 제한 정답률
3초 256MB 41.353%

 

문제

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

입력

첫째 줄에 온라인 저지 회원의 수 N이 주어진다. (1 ≤ N ≤ 100,000)

둘째 줄부터 N개의 줄에는 각 회원의 나이와 이름이 공백으로 구분되어 주어진다. 나이는 1보다 크거나 같으며, 200보다 작거나 같은 정수이고, 이름은 알파벳 대소문자로 이루어져 있고, 길이가 100보다 작거나 같은 문자열이다. 입력은 가입한 순서로 주어진다.

출력

첫째 줄부터 총 N개의 줄에 걸쳐 온라인 저지 회원을 나이 순, 나이가 같으면 가입한 순으로 한 줄에 한 명씩 나이와 이름을 공백으로 구분해 출력한다.

 

핵심

  • sort()함수는 퀵정렬 알고리즘으로 구현되어 있는데, 퀵정렬 알고리즘은 불안정 정렬 알고리즘이다.(키 값이 같은 원소들을 정렬할 때 원래 순서를 보장할 수 없다는 뜻이다.)
  • 따라서 stable_sort() 함수를 사용해야 한다. 이건 병합정렬 알고리즘(merge sort algorithm)으로 구현되어 있다.

코드

#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <utility>


using namespace std;

int n;


bool compare(pair<int, string> a, pair<int, string> b){
    return a.first < b.first;
}



int main(int argc, char* argv[]) {
	ios_base :: sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    
    cin >> n;
    
    vector<pair<int, string>> v(n);
    
    for(int i=0;i<n;i++){
        cin >> v[i].first >> v[i].second;
    }
    
    stable_sort(v.begin(), v.end(), compare);
    
    for(int i=0;i<n;i++){
        cout << v[i].first << " " << v[i].second << "\n";
    }
	
	return 0;
}

해설

간단하게 푸는 방법은,

벡터 안에 입력값들을 넣고, 나이순으로 정렬하면 그만이다!

다만 이때 조심해야 할 것이, 그냥 sort()함수를 사용하면 안된다.

sort() 함수는 핵심에서 말했다시피 불안정 정렬 알고리즘이기 때문이다ㅜㅜ

그래서 반드시 stable_sort()함수를 사용해야 한다.

 

또 다른 방법이 있다.

우선 길이가 200인 배열 v를 만든다.

이 배열 안에는 벡터가 하나씩 들어가는데, 만약 v[20]이라면 20살인 사람들의 이름이 담긴 벡터가 이 안에 있다.

(2차원 배열이라고 생각하면 된다.)

따라서, 입력값을 받을 때마다 그 사람의 나이에 해당하는 벡터를 찾아 넣어주면 끝이다!

코드를 보면 이해하기 쉬울 것이다.

 

#include <iostream>
#include <algorithm>
#include <string>
#include <vector>


using namespace std;

int n;

vector<string> v[210];
int tmp_n;


int main(int argc, char* argv[]) {
	ios_base :: sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    
    cin >> n;

    
    for(int i=1;i<=n;i++){
        string tmp_str;
        
        cin >> tmp_n;
        cin >> tmp_str;
        
        v[tmp_n].push_back(tmp_str);  
    }
    
    for(int i=1;i<=200;i++){
        for(int j=0;j<v[i].size();j++){
            cout << i << ' ' << v[i][j] << '\n';
        }
    }
    
    
	
	return 0;
}

 

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기