Programing/백준, 프로그래머스(C++)

[C++][백준 9017] 크로스 컨트리

hye3193 2025. 1. 17. 19:33

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

풀이

문제를 잘못 이해해서 엄청나게 삽질했던 문제...

1. 선수가 6명이 되지 않으면 점수를 받지 않는다. 

2. 1~4등까지의 점수 합으로 우승팀을 구한다. 만약 점수합이 같다면 5등의 점수가 더 적은 팀이 우승한다.

위 두 조건을 잘 챙겨서 작성해 주면 된다

제출 코드

#include <iostream>
using namespace std;

int arr[1001];
int teamMem[201];
int teamScr[201];
int teamCnt[201];
int fifthPlayer[201];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    int t, n;
    cin >> t;
    while(t--)
    {
        cin >> n;
        int score = 1;
        fill_n(arr, 1001, 0);
        fill_n(teamMem, 201, 0);
        fill_n(teamScr, 201, 0);
        fill_n(teamCnt, 201, 0);
        fill_n(fifthPlayer, 201, 0);

        for (int i = 0; i < n; i++)
        {
            int input;
            cin >> input;
            arr[i] = input;
            if (teamMem[arr[i]]++ == 4)
                fifthPlayer[arr[i]] = i;
        }

        for (int i = 0; i < n; i++)
        {
            if (teamMem[arr[i]] < 6) continue;
            if (teamCnt[arr[i]] > 3)
            {
                score++;
                continue;
            }
            teamScr[arr[i]] += score++;
            teamCnt[arr[i]]++;
        }

        pair<int, int> winner = {0, 60000};
        for (int i = 1; i <= 200; i++)
        {
            if (teamScr[i] == 0 || teamScr[i] > winner.second) continue;
            if (teamScr[i] == winner.second && fifthPlayer[i] > fifthPlayer[winner.first]) continue;
            winner.first = i;
            winner.second = teamScr[i];
        }

        cout << winner.first << '\n';
    }
}