본문 바로가기

백준/실버

[백준 2535번] 아시아 정보올림피아드 (C++)

문제링크 : https://www.acmicpc.net/problem/2535

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int MAX = INT_MAX;

int N, n1, n2, n3;
map<int, int>m;

struct info
{
    int country;
    int student;
    int grade;
};

vector<info>v;

bool cmp(info a, info b) //성적 순 정렬
{
    return a.grade > b.grade;
}

int main()
{
    ios_base::sync_with_stdio(0); 
	cin.tie(0);

    cin >> N;

    for(int i=0; i<N; i++)
    {
        cin >> n1 >> n2 >> n3;
        v.push_back({n1, n2, n3});
    }

    sort(v.begin(), v.end(), cmp);

    int cnt = 0;
    for(int i=0; i<N; i++)
    {
        m[v[i].country]++; //나라 갯수 카운팅
        if(m[v[i].country] > 2) continue; //메달은 나라별 최대 2개씩
        cout << v[i].country << " " <<v[i].student << "\n";
        cnt++; //금, 은, 동 3개 출력
        if(cnt == 3) break;
    }

    return 0;
}

 

다루는 값이 3가지 이므로 구조체에 저장하도록 하였다.

이후 성적 순으로 정렬을 시행해주고, 나라 갯수를 따로 map을 이용하여 카운팅하였다.

 

현재 성적 순으로 정렬된 상태이기 때문에 금,은,동 순서대로 출력하게 될 것이고, 만약 현재 출력 대상인 나라의 매달 갯수가 2개 이상이라면 스킵하도록 하였다.

금,은,동 이렇게 3가지만 출력해야 하므로 이를 위해 따로 카운팅할 변수를 이용하여 3개 출력후 종료하도록 하였다.