티스토리 뷰

반응형

복서들을 정해진 규칙대로 정렬하는 문제

 


문제의 조건

 

1. 복서들의 몸무게 배열 weights와 경기 전적을 나타낸 배열 head2head가 매개변수로 주어짐

 

2. 선수들은 주어진 몸무게 배열에 들어있는 순서대로 1번, 2번, ... 번호를 가지고 있다. 

-> 선수의 번호를 구하려면 몸무게 배열 인덱스+1 해주어야 함

 

3. 복서 정렬 조건

1) 승률이 높은 복서가 앞에 온다. -> 내림차순

2) 승률이 같다면 자기보다 몸무게가 무거운 복서를 이긴 횟수가 많은 복서가 앞에 온다. -> 내림차순

3) 2)에서 자기보다 무거운 복서를 이긴 횟수도 같으면 몸무게가 더 무거운 복서가 앞에 온다. -> 내림차순

4) 3)에서 몸무게도 같으면 번호가 빠른 사람이 앞에 온다. -> 오름차순

=> 위의 조건대로 compare 함수를 작성해야 함 

 

4. 주어진 조건대로 나열한 순서를 배열에 담아서 리턴 


#include <string>
#include <vector>
#include <algorithm>

using namespace std;

bool compare(const vector<float>& v1, const vector<float>& v2)
{
    if (v1.front() > v2.front())
        return true;

    if (v1.front() == v2.front() && v1[1] > v2[1])
        return true;

    if (v1.front() == v2.front() && v1[1] == v2[1] && v1[2] > v2[2])
        return true;

    if (v1.front() == v2.front() && v1[1] == v2[1] && v1[2] == v2[2] && v1[3] < v2[3])
        return true;

    return false;
}

vector<int> solution(vector<int> weights, vector<string> head2head) {
    vector<vector<float>> vecWinnings(weights.size()); //복서들의 승리 정보를 저장할 배열 
    for (int i = 0; weights.size() > i; i++)
    {
        float winningCount = 0;
        float roundCount = 0;
        float heavyCount = 0;
        for (int j = 0; head2head[i].length() > j; j++)
        {
            if (i != j)
            {
                //이겼으면 카운트를 증가시키는데 자기보다 무거운 복서를 이겼으면 그에 대한 카운트 추가로 증가 
                if ('W' == head2head[i][j])
                {
                    roundCount++;
                    winningCount++;
                    if (weights[j] > weights[i])
                        heavyCount++;
                }
                //졌을 때엔 경기 횟수 카운트만 증가 
                else if ('L' == head2head[i][j])
                    roundCount++;
            }
        }
        //승률 = 이긴 횟수 / 경기 횟수 
        float rate;
        if (0 == roundCount)
            rate = 0; //경기 한 적이 없으면 승률 0
        else 
            rate = winningCount / roundCount;

        //[승률, 자기보다 무거운 복서를 이긴 횟수, 몸무게, 번호] 순서로 저장 
        vecWinnings[i].emplace_back(rate);
        vecWinnings[i].emplace_back(heavyCount);
        vecWinnings[i].emplace_back(weights[i]);
        vecWinnings[i].emplace_back(i+1);
    }

    sort(vecWinnings.begin(), vecWinnings.end(), compare);

    vector<int> answer;
    for (int i = 0; weights.size() > i; i++)
        answer.emplace_back(vecWinnings[i][3]);

    return answer;
}

 

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함