문제 https://www.acmicpc.net/problem/10825
10825번: 국영수
첫째 줄에 도현이네 반의 학생의 수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 한 줄에 하나씩 각 학생의 이름, 국어, 영어, 수학 점수가 공백으로 구분해 주어진다. 점수는 1보다 크거나 같고, 1
www.acmicpc.net
풀이
2차원 벡터를 생성해서 입력값들을 저장했다.
2차원 벡터로 문자열과 1차원 정수 벡터를 짝으로 묶었으므로, 아래와 같이 저장된다.
v.first | v.second[0] | v.second[1] | v.second[2] |
이름 | 국어 점수 | 영어 점수 | 수학 점수 |
그 후, comp 함수를 생성하여 정렬했는데, comp 함수에는 문제가 요구하는 내용을 바탕으로 정렬하도록 했다.
국어 점수는 내림차순으로, 영어 점수는 오름차순으로, 수학 점수는 내림차순으로, 이름은 오름차순으로 정렬한다.
여기서 주의할 점! compare는 -1, 0, 1의 값만 리턴하는 것이 아니다.
A.compare(B)를 수행한다고 할 때,
1) A가 B보다 사전순으로 앞이라면 음수
2) A와 B가 같다면 0
3) A가 B보다 사전순으로 뒤라면 양수
처음에는 사전순으로 앞서면 -1을 리턴한다고 생각하고 구현하니 오류가 났고, 이를 0보다 작다고 고쳐주니 해결됐다.
코드
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
bool comp(pair<string,vector<int>> v1, pair<string,vector<int>> v2)
{
if(v1.second[0]>v2.second[0]) return true;
else if(v1.second[0]==v2.second[0])
{
if(v1.second[1]<v2.second[1]) return true;
else if(v1.second[1]==v2.second[1])
{
if(v1.second[2]>v2.second[2]) return true;
else if(v1.second[2]==v2.second[2])
{
if(v1.first.compare(v2.first)<0) return true;
else return false;
}
else return false;
}
else return false;
}
else return false;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n;
cin>>n;
vector<pair<string,vector<int>>> v;
vector<int> v2[100003];
for(int i=0; i<n; i++)
{
string s;
cin>>s;
for(int j=0; j<3; j++)
{
int a;
cin>>a;
v2[i].push_back(a);
}
v.push_back(make_pair(s,v2[i]));
}
sort(v.begin(),v.end(),comp);
for(int i=0; i<n; i++)
{
cout<<v[i].first<<'\n';
}
}
'알고리즘 > 문제 풀이' 카테고리의 다른 글
SWEA - 힙 (STL 사용 X) (0) | 2022.08.09 |
---|---|
SWEA - 공통조상 (C++) (0) | 2022.08.04 |
백준 1406 - 에디터(C++/DLL) (0) | 2022.07.16 |
백준 10819 - 차이를 최대로(C++) (0) | 2022.07.13 |
백준 5430 - AC(C++) (0) | 2022.07.11 |