Computer Science/Algorithm Problem

백준] 8979 - 올림픽(KOI 2013)

TwinParadox 2018. 2. 11. 20:04
728x90

시간 제한 : 1초

메모리 제한 : 128MB




입력

입력의 첫 줄은 국가의 수 N(1 ≤ N ≤ 1,000)과 등수를 알고 싶은 국가 K(1 ≤ K ≤ N)가 빈칸을 사이에 두고 주어진다. 각 국가는 1부터 N 사이의 정수로 표현된다. 이후 N개의 각 줄에는 차례대로 각 국가를 나타내는 정수와 이 국가가 얻은 금, 은, 동메달의 수가 빈칸을 사이에 두고 주어진다. 전체 메달 수의 총합은 1,000,000 이하이다.




출력

출력은 단 한 줄이며, 입력받은 국가 K의 등수를 하나의 정수로 출력한다. 등수는 반드시 문제에서 정의된 방식을 따라야 한다.




소스코드

#include <iostream>
#include <algorithm>
using namespace std;
struct nation
{
	int id, gold, silver, bronze, rank;
};
bool compare(struct nation a, struct nation b)
{
	if (a.gold > b.gold)
		return true;
	else if (a.gold == b.gold)
	{
		if (a.silver > b.silver)
			return true;
		else if (a.silver == b.silver)
		{
			return a.bronze > b.bronze ? true : false;
		}
		else
			return false;
	}
	else
		return false;
}
int main(void)
{
	int n, k, rank = 1, idx = 0;
	struct nation arr[1000];
	cin >> n >> k;
	for (int i = 0; i < n; i++)
		cin >> arr[i].id >> arr[i].gold >> arr[i].silver >> arr[i].bronze;
	
	sort(arr, arr + n, compare);

	arr[0].rank = rank;
	for (int i = 0; i < n; i++)
	{
		if (arr[i].gold == arr[idx].gold && arr[i].silver == arr[idx].silver && arr[i].bronze == arr[idx].bronze);
		else
			idx = i;
		while (arr[i].gold == arr[idx].gold && arr[i].silver == arr[idx].silver && arr[i].bronze == arr[idx].bronze)
		{
			arr[i].rank = rank;
			i++;
		}
		rank = i + 1;
		i--;
	}
	for(int i=0;i<n;i++)
		if (arr[i].id == k)
			cout << arr[i].rank;
}




Tip

제시된 방법으로 정렬해주고 메달의 숫자가 완전히 동일한 경우에 대해서 적절히 처리해주어야 한다.


728x90