Algorithm/백준

[백준] 8979 올림픽 with C++

nowkoes 2023. 6. 25. 15:05

문제설명


입출력 예제


개념

 올림픽에서 메달 획득 별 등수를 출력하는 문제다. 올림픽 메달 순위에서는 동점의 경우 같은 등수를 가지며, 그다음 등수는 동점인 나라의 수를 고려하여 건너뛰게 된다. 예를 들어, 금메달 수가 1개인 나라가 1등에 2개가 있다면, 그다음 나라는 3등이 된다. 이러한 동점 상황을 고려하여 문제를 풀면 해결할 수 있다.


풀이

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

struct medal
{
    int _id, _gold, _silver, _bronze;

    bool operator > (const medal& m) const
    {
        if (_gold != m._gold)
            return _gold > m._gold;

        else if (_silver != m._silver)
            return _silver > m._silver;

        else
            return _bronze > m._bronze;
    }
};

 국가의 이름, 금메달 수, 은메달 수, 동메달 수를 갖는 구조체 medal을 정의한다. 이때 등수의 기준을 금 → 은 → 동으로 둬야 하므로, 다음과 같이 연산자를 오버로딩해줘야 한다.

 

int main()
{
    int N, K;
    cin >> N >> K;

    vector<medal> v(N);

    for (int i = 0; i < N; ++i)
        cin >> v[i]._id >> v[i]._gold >> v[i]._silver >> v[i]._bronze;

    sort(v.begin(), v.end(), greater<>());

 나라의 수 N과, 등수가 궁금한 나라의 이름 K를 입력받고, 각 나라 별 메달 획득 수를 초기화한다. 그후 내림차순으로 정렬해 주자.

 

    int rank = 1, same = 0;

    for (int i = 0; i < N; ++i)
    {
        if (i > 0 && (v[i]._gold != v[i - 1]._gold || v[i]._silver != v[i - 1]._silver || v[i]._bronze != v[i - 1]._bronze))
        {
            rank += same;
            same = 0;
        }

        if (v[i]._id == K)
        {
            cout << rank;
            break;
        }

        same++;
    }
}

 rank를 현재 등수로 유지하며, same을 동점인 나라 수로 계산하여 등수를 업데이트하는 방식으로 작성하였다.

 

총합본

더보기
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

struct medal
{
    int _id, _gold, _silver, _bronze;

    bool operator > (const medal& m) const
    {
        if (_gold != m._gold)
            return _gold > m._gold;

        else if (_silver != m._silver)
            return _silver > m._silver;

        else
            return _bronze > m._bronze;
    }
};

int main()
{
    int N, K;
    cin >> N >> K;

    vector<medal> v(N);

    for (int i = 0; i < N; ++i)
        cin >> v[i]._id >> v[i]._gold >> v[i]._silver >> v[i]._bronze;

    sort(v.begin(), v.end(), greater<>());

    int rank = 1, same = 0;

    for (int i = 0; i < N; ++i)
    {
        if (i > 0 && (v[i]._gold != v[i - 1]._gold || v[i]._silver != v[i - 1]._silver || v[i]._bronze != v[i - 1]._bronze))
        {
            rank += same;
            same = 0;
        }

        if (v[i]._id == K)
        {
            cout << rank;
            break;
        }

        same++;
    }
}
반응형