본문 바로가기
Algorithm/BOJ

[BOJ]10814번: 나이순 정렬 (c++)

by HBGB 2020. 7. 6.

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

 

10814번: 나이순 정렬

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

www.acmicpc.net

 

방법 1: 입력된 순서 변수 하나 더 만들기

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

using namespace std;

struct member {
	int order, age;
	string name;
};

// age순, 입력된 순서대로 정렬
bool compare(const member &A, const member &B)
{
	if (A.age != B.age)
	{
		return A.age < B.age;
	}
	return A.order < B.order;
}

int main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	// 입력
	int N;
	cin >> N;
	vector<member> v(N);
	for (int i = 0; i < N; ++i)
	{
		v[i].order = i;
		cin >> v[i].age >> v[i].name;
	}

	// compare 조건대로 정렬
	sort(v.begin(), v.end(), compare);

	// 출력
	for (int i = 0; i < N; ++i)
	{
		cout << v[i].age << ' ' << v[i].name << '\n';
	}

	return 0;
}

 

방법 2: stable_sort로 입력받은 순서 유지하기

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

using namespace std;

struct member {
	int age;
	string name;
};

// age순 정렬
bool compare(const member& A, const member& B)
{
	return A.age < B.age;
}

int main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	// 입력
	int N;
	cin >> N;
	vector<member> v(N);
	for (int i = 0; i < N; ++i)
	{
		cin >> v[i].age >> v[i].name;
	}

	// compare 조건대로 정렬 (조건이 같으면 입력된 순서 유지)
	stable_sort(v.begin(), v.end(), compare);

	// 출력
	for (int i = 0; i < N; ++i)
	{
		cout << v[i].age << ' ' << v[i].name << '\n';
	}

	return 0;
}

 

 

안정성을 유지하는 정렬 알고리즘에는 병합정렬, 버블정렬 등이 있다.

그중에 O(n * log n)을 보장하는 알고리즘은 병합정렬이다. 

C++은 stable_sort()라는 함수를 쓰면 안정성을 유지하며 정렬할 수 있다. 

 

 

정렬 알고리즘의 시간복잡도와 안정성을 참고한 블로그

 

알고리즘 - 정렬 알고리즘 비교

- 정렬 알고리즘 시간 복잡도 알고리즘 최선 평균 최악 삽입 정렬 선택 정렬 버블 정렬 셸 정렬 퀵 정렬 힙 정렬 합병 정렬 기수 정렬 - 정렬 알고리즘별 실험 결과 알고리즘 실행시간 (단위 : 초)

dev-ahn.tistory.com

 

댓글