728x90
https://www.acmicpc.net/problem/8979
8979번: 올림픽
입력의 첫 줄은 국가의 수 N(1 ≤ N ≤ 1,000)과 등수를 알고 싶은 국가 K(1 ≤ K ≤ N)가 빈칸을 사이에 두고 주어진다. 각 국가는 1부터 N 사이의 정수로 표현된다. 이후 N개의 각 줄에는 차례대로 각
www.acmicpc.net
이건 구조체를 사용해서 풀면 좋다.
처음에는 vector pair를 어떻게 해서 풀려고 해 봤는데 국가 번호를 추가하는데 애를 먹었기 때문에 실패..
구조체를 사용하면 굉장히 편하게 여러 변수를 사용할 수 있다. 이를 꼭 기억하도록 하자...
sort함수를 사용해서 편하게 원하는 조건으로 정렬할 수 있다.
그 후, 조건대로 정렬한 배열 속에서 내 앞에 있는 원소들을 훑으면서 (내 앞에 원소들은 나보다 잘한 나라이기 때문에 answer++)
만약 금메달, 은메달, 동메달 개수가 모두 같다면 나보다 잘한 나라는 아니므로 여기서 빠져나온다.
#include <iostream>
#include <algorithm>
using namespace std;
//1. 금메달 수 더 많은 나라
//2. 금메달 수 같으면 은메달 수가 더 많은 나라
//3. 금, 은메달 수가 같으면 동메달 수가 더 많은 나라
struct Country{
int num;
int gold;
int silver;
int bronze;
};
bool compare(Country c1, Country c2){
if(c1.gold == c2.gold){
if(c1.silver == c2.silver) return c1.bronze > c2.bronze;
return c1.silver > c2.silver;
}
return c1.gold > c2.gold;
}
int main(){
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int n, k, answer = 0;
Country arr[1001];
cin >> n >> k;
for(int i=0; i<n; i++) {
int country, gold, silver, bronze;
cin >> country >> gold >> silver >> bronze;
arr[i].num = country;
arr[i].gold = gold;
arr[i].silver = silver;
arr[i].bronze = bronze;
}
sort(arr, arr+n, compare);
int want = 0;
for(int i=0; i<n; i++){
if(arr[i].num == k) {
want = i;
break; //내가 구하고 싶은 나라 인덱스 - 정렬했으니까 달라졋음
}
}
for(int i=0; i<=want; i++){
if(arr[i].gold == arr[want].gold && arr[i].silver == arr[i].silver && arr[i].bronze == arr[want].bronze) break;
answer++;
}
cout << answer+1 << '\n';
return 0;
}
728x90
'알고리즘 > 백준' 카테고리의 다른 글
[백준/c++] 2583번: 영역 구하기 (0) | 2022.07.23 |
---|---|
[백준/c++] 2816번: 디지털 티비 (0) | 2022.07.23 |
[백준/c++] 2621번: 카드게임 (0) | 2022.07.23 |
[백준/c++] 1652번: 누울 자리를 찾아라 (0) | 2022.07.23 |
[백준/c++] 16439번: 치킨치킨치킨 (0) | 2022.07.22 |