https://www.acmicpc.net/problem/10814
사고과정은 크게 두가지이다.
1. 변수가 두개이고 서로 연동되어 있으니, pair을 사용해볼 것인가
2. 아니면 그냥 클래스나 구조체로 묶어서 활용할 것인가
사실 풀면서 1번 생각이 났지만 pair을 사용해본 적이 없어서 문제는 클래스로 풀었지만 구글링해서 배운 결과를 공유해볼까한다.
1. pair을 활용
#include <iostream>
#include <vector>
#include <algorithm>
#include <utility>
using namespace std;
bool cmp (pair<int, string> u, pair<int, string> v)
{
return u.first < v.first;
}
int main()
{
int T;
cin >> T;
vector<pair<int, string>> vec(T);
for (int i = 0; i < T; i++)
cin >> vec[i].first >> vec[i].second;
stable_sort(vec.begin(), vec.end(), cmp);
for (int i = 0; i < T; i++)
cout << vec[i].first << " " << vec[i].second << "\n";
}
코드가 매우 직관적이다.
sort 함수를 활용해 first, 즉 나이 순을 활용해서 정렬하고 있다.
2. 클래스를 활용
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Person
{
public:
int age;
string name;
int index;
};
bool cmp(Person u, Person v)
{
if (u.age < v.age)
return true;
else if (u.age == v.age)
return u.index < v.index;
else
return false;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
int N;
cin >> N;
std::vector<Person> arr(N);
for (int i = 0; i < N; i++)
{
cin >> arr[i].age >> arr[i].name;
arr[i].index = i;
}
sort(arr.begin(), arr.end(), cmp);
for (int i = 0; i < N; i++)
{
cout << arr[i].age << " " << arr[i].name << '\n';
}
return 0;
}
클래스를 활용할 경우 아까 1번의 pair 경우랑 야악간 다르다.
pair의 경우는 입력받은 값들이 말 그대로 순서대로 되어있지만
class의 경우는 만약 나이가 같을 경우 어떤 것을 우선으로 해야할지 처리해줘야한다.
그래서 class에 입력 순서를 받을 index라는 변수를 선언해서 순서를 저장해서 cmp 함수에 활용하였다.
개인적으로 의미있게 배운 문제이다. 복습 자주 해야징!
'백준 문제풀이 > 실버5' 카테고리의 다른 글
백준 7568번 - 덩치 (0) | 2022.02.15 |
---|---|
백준 1476번 - 날짜 계산 (0) | 2022.01.16 |
백준 10989번 - 수 정렬하기 3 (using counting sort) (0) | 2021.12.16 |
백준 2609번 - 최대공약수와 최소공배수(with 유클리드 호제법) (0) | 2021.12.14 |
백준 4673번 - 셀프 넘버 (0) | 2021.11.23 |