본문 바로가기

개발/ProblemSolving

백준 #8979 올림픽

반응형

올림픽은 참가에 의의가 있기에 공식적으로는 국가간 순위를 정하지 않는다. 그러나, 많은 사람들이 자신의 국가가 얼마나 잘 하는지에 관심이 많기 때문에 비공식적으로는 국가간 순위를 정하고 있다. 두 나라가 각각 얻은 금, 은, 동메달 수가 주어지면, 보통 다음 규칙을 따라 어느 나라가 더 잘했는지 결정한다.

 

  1. 금메달 수가 더 많은 나라 
  2. 금메달 수가 같으면, 은메달 수가 더 많은 나라
  3. 금, 은메달 수가 모두 같으면, 동메달 수가 더 많은 나라 

각 국가는 1부터 N 사이의 정수로 표현된다. 한 국가의 등수는 (자신보다 더 잘한 나라 수) + 1로 정의된다. 만약 두 나라가 금, 은, 동메달 수가 모두 같다면 두 나라의 등수는 같다. 예를 들어, 1번 국가가 금메달 1개, 은메달 1개를 얻었고, 2번 국가와 3번 국가가 모두 은메달 1개를 얻었으며, 4번 국가는 메달을 얻지 못하였다면, 1번 국가가 1등, 2번 국가와 3번 국가가 공동 2등, 4번 국가가 4등이 된다. 이 경우 3등은 없다. 

각 국가의 금, 은, 동메달 정보를 입력받아서, 어느 국가가 몇 등을 했는지 알려주는 프로그램을 작성하시오. 

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

 


 

주어진 메달을 비교하여 등수를 알아내는 구현 문제입니다.

처음에는 금메달은 3점, 은메달은 2점, 동메달 1점으로 점수로 계산했었는데 여러번 시도 끝에 생각한게 금메달 개수보다 은매달 개수가 많아지면 순위가 이상해지는 문제가 발생합니다...

 

단순히 금메달, 은메달, 동메달을 비교하여 정렬한 뒤 순위를 매겨줬습니다.

정렬을 해주었기 때문에 순위를 매겨주는 부분에서는 동점 여부만 확인해주고 아니라면 순위를 올려주면 됩니다.

(i-1 순위는 i보다 높은 점수이기 때문)

 

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

typedef struct _nation {
    int id;
    int gold, silver, bronze;
    int rank;
} _nation;

vector<_nation> nation;

bool comp(_nation a, _nation b) {
    if (a.gold > b.gold) {
        return true;
    } else if (a.gold == b.gold) {
        if (a.silver > b.silver) {
            return true;
        } else if (a.silver == b.silver) {
            if (a.bronze > b.bronze) {
                return true;
            } else {
                return false;
            }
        } else {
            return false;
        }
    } else {
        return false;
    }
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    int N, K;
    cin >> N >> K;

    for (int i = 0; i < N; i++) {
        int a, g, s, b;
        cin >> a >> g >> s >> b;
        nation.push_back({a, g, s, b, 1});
    }

    sort(nation.begin(), nation.end(), comp);

    for (int i = 1; i < N; i++) {
        if (nation[i].gold == nation[i - 1].gold &&
            nation[i].silver == nation[i - 1].silver &&
            nation[i].bronze == nation[i - 1].bronze) {
            nation[i].rank = nation[i - 1].rank;
        } else {
            nation[i].rank = i+1;
        }
    }

    for (int i = 0; i < N; i++) {
        if (nation[i].id == K) {
            cout << nation[i].rank;
            break;
        }
    }

    return 0;
}

 

 

 

반응형

'개발 > ProblemSolving' 카테고리의 다른 글

백준 #6581 HTML  (0) 2020.04.06
백준 #2688 줄어들지 않아  (0) 2020.03.12
최대공약수와 최소공배수  (0) 2019.12.22