문제 출처
1. 문제설명
- 국가간 순위를 결정하는 규칙은 다음과 같다.
- 금메달 수가 더 많은 나라
- 금메달 수가 같으면, 은메달 수가 더 많은 나라
- 금, 은메달 수가 모두 같으면, 동메달 수가 더 많은 나라
- 만약 공동 2등이 있다면 그 다음 등수는 4등이 된다.
2. 알고리즘 설계
- 정렬 문제이다.
- 금메달 많은 > 은메달 많은 > 동메달 많은 국가 순으로 정렬하면 된다.
- 같은 등수가 있을 수 있으므로, 메달 개수가 같은 국가를 한번 더 체크한다.
3. 로직
- custom compare 함수를 구현해, 위에 언급한 순서대로 정렬한다.
- 정렬 후, 타겟의 인덱스 위치를 찾는다.
- 타겟의 인덱스가 갖고 있는 메달과 같은 개수를 가진 국가가 있는지 찾는다.
- 만약 있다면, 그 때 처음 만난 등수가 공동 등수가 된다.
4. 전체 코드
#include<bits/stdc++.h>
using namespace std;
using pii = pair<int, int>;
typedef struct {
int gold, silver, bronze, num;
}Medal;
bool compare(const Medal& a, const Medal& b) {
if (a.gold == b.gold) {
if (a.silver == b.silver) return a.bronze > b.bronze;
return a.silver > b.silver;
}
return a.gold > b.gold;
}
int main(void)
{
ios::sync_with_stdio(false);
cin.tie(NULL);
int n, k;
cin >> n >> k;
vector<Medal> v(n);
for (int i = 0; i < n; i++) {
int c, g, s, b;
cin >> c >> g >> s >> b;
v[c - 1] = { g,s,b,c };
}
sort(v.begin(), v.end(), compare);
Medal target;
for(int i=0; i<n; i++)
if (v[i].num == k) {
target = v[i];
break;
}
int rank;
for (int i = 0; i < n; i++) {
if (v[i].gold == target.gold && v[i].silver == target.silver && v[i].bronze == target.bronze) {
rank = i+1;
break;
}
}
cout << rank;
return 0;
}
5. 소감
- 이 문제는 공동 등수가 페이크이다.
- 보통은 타겟을 찾으면 바로 정답을 출력하게 구현해서 20점이 나올 것이다.
- 한번 더 공동 등수를 체크하는 게 가장 중요한 문제였던 거 같다.