https://www.acmicpc.net/problem/8979
올림픽은 참가에 의의가 있기에 공식적으로는 국가간 순위를 정하지 않는다. 그러나, 많은 사람들이 자신의 국가가 얼마나 잘 하는지에 관심이 많기 때문에 비공식적으로는 국가간 순위를 정하고 있다. 두 나라가 각각 얻은 금, 은, 동메달 수가 주어지면, 보통 다음 규칙을 따라 어느 나라가 더 잘했는지 결정한다.
각 국가의 금, 은, 동메달 정보를 입력받아서, 어느 국가가 몇 등을 했는지 알려주는 프로그램을 작성하시오.
입력의 첫 줄은 국가의 수 N(1 ≤ N ≤ 1,000)과 등수를 알고 싶은 국가 K(1 ≤ K ≤ N)가 빈칸을 사이에 두고 주어진다. 각 국가는 1부터 N 사이의 정수로 표현된다. 이후 N개의 각 줄에는 차례대로 각 국가를 나타내는 정수와 이 국가가 얻은 금, 은, 동메달의 수가 빈칸을 사이에 두고 주어진다. 전체 메달 수의 총합은 1,000,000 이하이다.
출력은 단 한 줄이며, 입력받은 국가 K의 등수를 하나의 정수로 출력한다. 등수는 반드시 문제에서 정의된 방식을 따라야 한다.
#include <iostream>
#include <algorithm>
#include <vector>
#define fastio ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
using namespace std;
typedef struct
{
int countryName;
int gold;
int sliver;
int bronze;
} Country;
int n, k;
int compare(Country c1, Country c2)
{
// 금메달 점수가 같다면 은메달 수가 더 많은 나라 정렬
if (c1.gold == c2.gold)
{
// 금, 은메달 수가 모두 같으면, 동메달 수가 더 많은 나라
if (c1.sliver == c2.sliver)
{
// 금,은,동메달 수가 전부 같으면 k번째 나라가 먼저 오도록 정렬
if (c1.bronze == c2.bronze)
{
return c1.countryName == k;
}
return c1.bronze > c2.bronze;
}
return c1.sliver > c2.sliver;
}
return c1.gold > c2.gold;
}
int main()
{
vector<Country> country;
cin >> n >> k;
country.resize(n);
for (int i = 0; i < n; i++)
{
cin >> country[i].countryName >> country[i].gold >> country[i].sliver >> country[i].bronze;
}
sort(country.begin(), country.end(), compare);
for (int i = 0; i < country.size(); i++)
{
if (country[i].countryName == k)
{
cout << i + 1 << '\n';
return 0;
}
}
return 0;
}