본문 바로가기

Algorithm/Implementation

(C++) - 백준(BOJ) 8979번 : 올림픽

반응형

https://www.acmicpc.net/problem/8979

 

8979번: 올림픽

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

www.acmicpc.net

간단한 구현문제였습니다.

 

풀이방법 :

1. 금메달,은메달,동메달 마다 점수차이를 두어 총합점수를 나라별로 저장한다. 이때 각 메달의 점수 차이가 월등히 벌어지도록 한다. 또한 금메달 1개가 은메달 3개와 점수가 같은 상황히 발생하지 않도록 점수를 정한다.

2. 점수가 key인 배열을 내림차순으로 정렬한다.

3. 점수 높은 순으로 정렬된 나라에 대해 rank를 매긴다.

4. k번째 나라의 rank를 출력한다.

 

소스코드 : 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
#include <algorithm>
#include <vector>
#define MAX 1000000
#define ll long long
using namespace std;
//각 나라의 점수, 번호를 저장
vector <pair<ll, ll>> point;
//각 나라의 등수, 번호를 저장
vector <pair<ll, ll>> country_rank(1001);
int main() {
    int n, k;
    //n : 나라개수, k : 국가 k의 등수
    cin >> n >> k;
    //금,은,동 3점,2점,1점
    for (int i = 0; i < n; i++) {
        ll num, gold, silver, bronze;
        cin >> num >> gold >> silver >> bronze;
        ll total_point = gold*1000*MAX + silver*MAX + bronze;
        point.push_back({ total_point, num });
    }
    //점수 내림차순으로 sort
    sort(point.rbegin(), point.rend());
    country_rank[0].first = 1;
    country_rank[0].second = point[0].second;
    int pivot = 1;
    int cnt = 0;
    for (int i = 1; i < n; i++) {
        int flag = 0;
        if (point[i - 1].first > point[i].first)
        {
            pivot++;
            country_rank[i].first = pivot + cnt;
            pivot += cnt;
            cnt = 0;
        }
        else {
            cnt++;
            country_rank[i].first = pivot;
        }
        country_rank[i].second = point[i].second;
    }
    for (int i = 0; i < n; i++) {
        if (country_rank[i].second == k)
            cout << country_rank[i].first << '\n';
    }
}
cs