알고리즘/백준

[백준/c++] 8979번: 올림픽

녕이 2022. 7. 23. 16:10
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