본문 바로가기

컴퓨터/백준 알고리즘

백준 알고리즘 10814번: 나이순 정렬 [C++]

문제 출처: www.acmicpc.net/problem/10814

 

10814번: 나이순 정렬

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

www.acmicpc.net

1. 코드

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

using namespace std;

typedef struct {
	int num;		//입력 순서 저장
	int age;
	string name;
}Person;

int cmp(const Person& a, const Person& b)
{
	if (a.age == b.age) return a.num < b.num;	//나이가 같다면 입력 순으로 올림차순
	else return a.age < b.age;			//나이순으로 올림차순
}
int main(void)
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);

	int n;
	cin >> n;

	Person* arr = new Person[n];

	for (int i = 0; i < n; i++)
	{
		cin >> arr[i].age >> arr[i].name;
		arr[i].num = i;
	}

	sort(arr, arr + n, cmp);

	for (int i = 0; i < n; i++)
		cout << arr[i].age << " " << arr[i].name << '\n';

	delete[] arr;
	return 0;
}

(실행)

2. 풀이

typedef struct {
	int num;		//입력 순서 저장
	int age;
	string name;
}Person;

쉽게 접근하기 위해 구조체를 선언했는데 num은 입력의 순번을 저장하는 것이고 age는 나이, name 해당 인물의 이름을 저장하는 용도이다.

int n;
cin >> n;

Person* arr = new Person[n];

그리고 데이터 케이스의 개수를 변수 n을 통해 입력받고 구조체 포인터를 n만큼의 크기로 동적할당한다.

for (int i = 0; i < n; i++)
{
    cin >> arr[i].age >> arr[i].name;
    arr[i].num = i;
}

그리고 나이와 이름을 입력받고 index값을 num에 저장한다.

sort(arr, arr + n, cmp);

sort를 이용하여 arr을 정렬하는데

int cmp(const Person& a, const Person& b)
{
	if (a.age == b.age) return a.num < b.num;	//나이가 같다면 입력 순으로 올림차순
	else return a.age < b.age;			//나이순으로 올림차순
}

나이가 같다면 입력한 순번을 기준으로 올림차순으로 정렬하고 그렇지않ㄷ다면 나이를 기준으로 올림차순으로 정렬한다.

for (int i = 0; i < n; i++)
    cout << arr[i].age << " " << arr[i].name << '\n';

delete[] arr;
return 0;

그리고 반복문을 통해 정렬되 나이와 이름을 출력하고 arr의 메모리를 해제한다.

3. 느낀 점

처음에 비해서 구조체를 이용한 정렬에 익숙해지고 있는 느낌이다.