본문 바로가기

Algorithm Problems/정렬

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

문제

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


문제 요약

n명의 온라인 저지에 가입한 사람들의 나이와 이름이 순서대로 주어진다.

 

회원들의 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에  오는 순서로 정렬하여 출력한다.


코드

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

using namespace std;

int n;

vector<tuple<int, string, int>> arr;

// 정렬 조건을 정의하는 함수
bool compare(tuple<int, string, int> a, tuple<int, string, int> b) {
	if (get<0>(a) == get<0>(b)){
		return get<2>(a) < get<2>(b);
	}
	return get<0>(a) < get<0>(b);
}

int main() {
	
	cin >> n;

	// 정보 입력
	for (int i = 0; i < n; i++) {
		int age;
		string name;

		cin >> age >> name;
		arr.push_back({ age, name, i });
	}

	// 정렬
	sort(arr.begin(), arr.end(), compare);

	// 정보 출력
	for (int i = 0; i < n; i++) {
		int age, idx;
		string name;
		tie(age, name, idx) = arr[i];

		cout << age << " " << name << "\n";
	}

	return 0;
}

코드 설명

1. 온라인 저지에 가입한 사람들의 정보를 순서대로 입력 받는다.

=> 벡터를 이용한다.

각 요소의 구성: (나이, 이름, 순서)

 

2. 정렬을 위해 compare 함수를 정의한다.

- 첫 번째 요소(나이)가 같다면 세 번째 요소(순서)가 작은 요소가 앞에 정렬되도록 한다. 

 

3. 정렬된 벡터를 출력한다.


고찰

bool compare()는 첫 번째 인자와 두 번째 인자를 비교한다.

 

1. true인 조건은 첫 번째 인자가 두 번째 인자보다 더 앞에 있다고 간주하는 상황이다.

 

2. false인 조건은 첫 번째 인자가 두 번째 인자보다 더 뒤에 있다고 간주하는 상황이다.