반응형
https://www.acmicpc.net/problem/8979
간단한 구현문제였습니다.
풀이방법 :
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 |
'Algorithm > Implementation' 카테고리의 다른 글
(C++) - 백준(BOJ) 11866번 : 요세푸스 문제 0 (0) | 2020.07.24 |
---|---|
(C++) - 백준(BOJ) 1259번 : 팰린드롬수 (0) | 2020.07.08 |
(C++) - 백준(BOJ) 2108번 : 통계학 (0) | 2020.04.07 |
(C++) - 백준(BOJ) 18808번 : 스티커 붙이기 (0) | 2020.04.05 |
(C++) - 백준(BOJ) 17174번 : 전체 계산 횟수 (0) | 2020.03.12 |