문제 출처: www.acmicpc.net/problem/10814
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. 느낀 점
처음에 비해서 구조체를 이용한 정렬에 익숙해지고 있는 느낌이다.
'컴퓨터 > 백준 알고리즘' 카테고리의 다른 글
백준 알고리즘 15650번: N과 M (2) [C++] (0) | 2021.02.18 |
---|---|
백준 알고리즘 15649번: N과 M(1) [C++] (0) | 2021.02.17 |
백준 알고리즘 1181번: 단어 정렬 [C++] (0) | 2021.02.15 |
백준 알고리즘 11651번: 좌표 정렬하기 2 [C++] (0) | 2021.02.14 |
백준 알고리즘 11650번: 좌표 정렬하기 [C++] (0) | 2021.02.13 |