문제 출처

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점이 나올 것이다.
  • 한번 더 공동 등수를 체크하는 게 가장 중요한 문제였던 거 같다.