문제 설명
올림픽은 참가에 의의가 있기에 공식적으로는 국가간 순위를 정하지 않는다. 그러나, 많은 사람들이 자신의 국가가 얼마나 잘 하는지에 관심이 많기 때문에 비공식적으로는 국가간 순위를 정하고 있다. 두 나라가 각각 얻은 금, 은, 동메달 수가 주어지면, 보통 다음 규칙을 따라 어느 나라가 더 잘했는지 결정한다.
- 금메달 수가 더 많은 나라
- 금메달 수가 같으면, 은메달 수가 더 많은 나라
- 금, 은메달 수가 모두 같으면, 동메달 수가 더 많은 나라
각 국가는 1부터 N 사이의 정수로 표현된다. 한 국가의 등수는 (자신보다 더 잘한 나라 수) + 1로 정의된다. 만약 두 나라가 금, 은, 동메달 수가 모두 같다면 두 나라의 등수는 같다. 예를 들어, 1번 국가가 금메달 1개, 은메달 1개를 얻었고, 2번 국가와 3번 국가가 모두 은메달 1개를 얻었으며, 4번 국가는 메달을 얻지 못하였다면, 1번 국가가 1등, 2번 국가와 3번 국가가 공동 2등, 4번 국가가 4등이 된다. 이 경우 3등은 없다.
각 국가의 금, 은, 동메달 정보를 입력받아서, 어느 국가가 몇 등을 했는지 알려주는 프로그램을 작성하시오.
https://www.acmicpc.net/problem/8979
제한 사항
풀이
문제를 요약하면, 각 메달의 개수에 따라 등수를 출력하면 된다.
만약, 모든 메달의 개수가 같다면 공동 k등이 된다.
해당 문제는 여러번의 비교와 정렬과정이 필요하기 때문에 구조체를 만들어서 연산자 오버로딩을 이용하였다.
struct Country
{
Country(int n, int g, int s, int b) :
number(n),
gold(g),
silver(s),
bronze(b)
{
};
int number;
int gold;
int silver;
int bronze;
bool operator==(const Country& Other) const
{
return gold == Other.gold && silver == Other.silver && bronze == Other.bronze;
}
bool operator!=(const Country& Other) const
{
return gold != Other.gold || silver != Other.silver || bronze != Other.bronze;
}
};
메달의 개수에 따라 정렬을 진행한 후, 만약 자신의 앞순위의 나라와 동일한 메달이라면 순위를 증가시키지 않고 다르다면 순위를 증가시키면 된다.
int ans = 1;
int increase = 1;
for (int i = 1; i < N; i++)
{
if (Countries[i - 1] == Countries[i])
{
increase++;
}
else
{
ans += increase;
increase = 1;
}
if (Countries[i].number == K)
{
cout << ans;
break;
}
}
전체 코드
#include <stdio.h>
#include <cstring>
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cmath>
#include <climits>
#include <queue>
#include <map>
#include <unordered_map>
#include <set>
using namespace std;
int N, K;
struct Country
{
Country(int n, int g, int s, int b) :
number(n),
gold(g),
silver(s),
bronze(b)
{
};
int number;
int gold;
int silver;
int bronze;
bool operator==(const Country& Other) const
{
return gold == Other.gold && silver == Other.silver && bronze == Other.bronze;
}
bool operator!=(const Country& Other) const
{
return gold != Other.gold || silver != Other.silver || bronze != Other.bronze;
}
};
bool cmp(const Country& a, const Country& b)
{
if (a.gold != b.gold) return a.gold > b.gold;
if (a.silver != b.silver) return a.silver > b.silver;
return a.bronze > b.bronze;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> N >> K;
vector<Country> Countries;
for (int i = 0; i < N; i++)
{
int n, g, s, b;
cin >> n >> g >> s >> b;
Country temp(n, g, s, b);
Countries.push_back(temp);
}
sort(Countries.begin(), Countries.end(), cmp);
if (Countries[0].number == K)
{
cout << 1;
return 0;
}
int ans = 1;
int increase = 1;
for (int i = 1; i < N; i++)
{
if (Countries[i - 1] == Countries[i])
{
increase++;
}
else
{
ans += increase;
increase = 1;
}
if (Countries[i].number == K)
{
cout << ans;
break;
}
}
return 0;
}