알고리즘/문제 풀이

백준 10825 - 국영수(C++)

qqlzzb 2022. 7. 17. 23:33

문제 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