처음에 boj 10825번 문제에 대해서 4개의 원소를 하나로 엮어서 vector에 넣어야 하는 상황이어서 이걸 어떻게 엮을까,
2개의 원소면 pair로, 3개의 원소면 tuple을 사용했는데, 4개면 quadrople 같은게 있는건가 싶어서 인텔리센스를 이용해서 quadrople 같은걸 찾아보려해도 나오질 않고, 어떻게 할까 하다가
tuple의 함수에 대한 설명을 보니까 이게 원소가 3개로 한정되어있는 형태가 아닌것 같아서 4개를 넣어보니까 4개를 받아들여서, tuple이라는것이 원소 3개를 받아들이는 형태로 만들어진것이 아닌걸 알게되었다.
튜블은 2개,3개,4개, ... , 등 여러가지 원소를 받아들여서 엮어서 사용할 수 있게 만들어 주는 클래스였다.
그래서 그것을 이용해서 만들어보고, 개별 요소에 대한 접근은 검색해보아서 get<i>(name) 형태에 대해 알게되어서 그것을 사용하여서 코드를 작성하였다. 그래서 작성한 코드를 첨부해보자면,
#include <bits/stdc++.h>
using namespace std;
//tuple<0,1,2,3> 이때 0은 이름, 1은 국어, 2는 영어, 3은 수학
bool cmp(const tuple<string,int,int,int>& a, const tuple<string,int,int,int>& b) {
if (get<1>(a) == get<1>(b) && get<2>(a) == get<2>(b) && get<3>(a) == get<3>(b))
return get<0>(a) < get<0>(b);
if (get<1>(a) == get<1>(b) && get<2>(a) == get<2>(b))
return get<3>(a) > get<3>(b);
if (get<1>(a) == get<1>(b))
return get<2>(a) < get<2>(b);
return get<1>(a) > get<1>(b);
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int n;
cin >> n;
vector<tuple<string, int, int, int>> v;
for(int i=0; i<n; i++) {
string name;
int korean;
int eng;
int math;
cin >>name>> korean >> eng >> math;
v.push_back({ name,korean,eng,math });
}
sort(v.begin(), v.end(), cmp);
for (auto c : v)
cout << get<0>(c) << '\n';
}
이렇게 코드를 작성해서 제출해서 통과를 하였는데, 나중에 첨부된 다른 정답 코드를 참고해보니 아주 간결하게 풀 수 있는 방법이 있었다. 그 방법은 따로 공부하도록 하고, 그래도 이번 문제 풀이를 통해서 ,
tuple의 경우 원소가 3개일때 고정적으로 활용하는것이 아닌, 원소가 1개 이상일때 사용할 수 있다는것,
tuple의 개별적인 원소에 대한 접근은 get<원소의 인덱스(0부터)>(개별 튜블 이름) 을 통해서 값을 가져올 수 있다는것을 배웠다.
이렇게 튜블을 활용해서 하나만 설정해서 값을 가져올수도 있다.
튜플을 사용할때 개별 원소에 대해서 비교하거나 값을 가져올때
get<index>(튜블이름) 형태를 잘 이용하도록 하자.
그리고 이 문제를 통해 이렇게 sort()를 활용할때 아주 훌륭한 센스를 활용해서 문제를 쉽게 해결하는 방법에 대해서 어떻게 그렇게 해결 할 수 있는지에 대해서 완전히 이해하고 그 방법을 잘 활용하도록 하자.
이때에 그렇게 해결하기 위해서는 sort() 자체의 대부 정렬이 어떤 순서로 이루어지는지 확실하게 이해하고 그것을 이용해서 어떻게 하면 쉽게 풀 수 있을지에 대해서 생각해야한다.