본문 바로가기

문제 풀이/문제 풀이(BOJ)

[Silver V] 올림픽 - 8979

[문제 위치]

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

[문제 풀이]

순위를 매기는 문제이다.

기본적 로직은 금매달이 은메달보다 은메달이 동메달보다 우위이며 순위는 자신보다 높은 사람+1 만큼만 고려하기 때문에 간단히 구현할 수 있다.

 

방법은 알고 싶은 국가의 메달 갯수를 스탠다드로 정한 다음 나라들의 매달 갯수를 순회하며 더 높은 순위인지 아닌지만 판단하여 그렇다면 rank를 낮추는 식으로 구현하면 된다.

 

문제 조건에는 정렬을 이용하도록 하였지만 최선의 선택을 하는 그리디 방식으로도 가능하다.

#include <iostream>
#include <vector>

using namespace std;

#define fastio ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)

int main() {
    fastio;  // 빠른 입출력 설정
    int medal[1000][4];
    int N, K;
    cin >> N >> K;

    int std_G, std_S, std_B;

    for (int i = 0; i < N; i++) {
        int nation, gold, silver, bronze;
        cin >> nation >> gold >> silver >> bronze;
        if (nation == K) {
            std_G = gold;
            std_S = silver;
            std_B = bronze;
        }
        medal[i][0] = nation;
        medal[i][1] = gold;
        medal[i][2] = silver;
        medal[i][3] = bronze;
    }

    int rank = 1; // 순위는 1부터 시작

    for (int i = 0; i < N; i++) {
        if (medal[i][1] > std_G ||
            (medal[i][1] == std_G && medal[i][2] > std_S) ||
            (medal[i][1] == std_G && medal[i][2] == std_S && medal[i][3] > std_B)) {
            rank++;
        }
    }

    cout << rank << '\n';

    return 0;
}

'문제 풀이 > 문제 풀이(BOJ)' 카테고리의 다른 글

[Silver V] 피자 - 14606  (1) 2024.08.27
[Silver V] 암호해독기 - 17176  (0) 2024.08.27
[Bronze II] 트럭주차 - 2979  (0) 2024.08.25
[Silver V] 최후의 승자 - 12760  (0) 2024.08.25
[Silver V] 행렬 곱셈 - 2740  (0) 2024.08.23