Algorithm/Solution

[백준] 8979 올림픽 C++ 코드

BeNI 2022. 3. 17. 18:33
728x90

8979번: 올림픽 (acmicpc.net)

 

8979번: 올림픽

입력의 첫 줄은 국가의 수 N(1 ≤ N ≤ 1,000)과 등수를 알고 싶은 국가 K(1 ≤ K ≤ N)가 빈칸을 사이에 두고 주어진다. 각 국가는 1부터 N 사이의 정수로 표현된다. 이후 N개의 각 줄에는 차례대로 각

www.acmicpc.net


문제 :

올림픽 메달 순위 구하는 문제

 

해설 :

맨처음엔 배열로 해보다가 그냥 정렬하는게 낫겠다 싶어서

다중 페어벡터를 선언해서 정렬함수를 이용하여 정렬을 해줬다.

근데 순위가 같은 경우가 있어서 다중 반복문을 이용해 같은 걸 찾아주었다.

 

#include <iostream>
#include <algorithm> 
#include <vector>
using namespace std;

int n, k, ans;
vector<pair<pair<int, int>, pair<int, int>>> v;

bool op(const pair<pair<int, int>, pair<int, int>>& a, pair<pair<int, int>, pair<int, int>>& b) {
    if (a.first.second == b.first.second) {
        if (a.second.first == b.second.first) {
            return a.second.second > b.second.second;
        }
        else return a.second.first > b.second.first;
    }
    else return a.first.second > b.first.second;
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL), cout.tie(nullptr);

    cin >> n >> k;
    for (int i = 0; i < n; i++) {
        int k, g, s, b;
        cin >> k >> g >> s >> b;
        v.push_back(make_pair(make_pair(k, g), make_pair(s, b)));
    }

    sort(v.begin(), v.end(), op);

    for (int i = 0; i < n; i++) {
        if (k == v[i].first.first) {
            for (int j = 0; j < n; j++) {
                if (j == i) continue;
                else {
                    if (v[i].first.second == v[j].first.second) {
                        if (v[i].second.first == v[j].second.first) {
                            if (v[i].second.second == v[j].second.second) {
                                cout << j + 1;
                                return 0;
                            }
                        }
                    }
                }
            }
            cout << i + 1;
        }
    }
}

 

코드가 너무 너무 더럽다ㅎ 

다른 방법으로 금메달개수*숫자 + 은개수*숫자 + 동개수*숫자

해서 총 합이 가장 큰 순서대로 하면 괜찮을 거 같다는생각이 드는데

숫자를 몇으로 해야 답이 제대로 나올 지 모르겠다..

 

그래도 이 문제로 다중페어벡터 정렬 할 수 있게 되었음

728x90