[プログラマー]6週目ソートボクサー


回答日:2021-09-19

質問する


質問リンク:https://programmers.co.kr/learn/courses/30/lessons/85002

アクセスと解析


次のようにコードを実現した.
  • 名の選手から勝利率を求め、勝利時に相手選手の体重より体重の重い選手を選ぶ回数.
  • 各選手
  • は、選手番号、勝率、より重いボクサーに勝った回数、体重情報を保存する.
  • で与えられた条件に従って並べ替えられ、並べ替えられた選手番号が返される.
  • コード#コード#

    #include <string>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    
    struct boxer {
        int num;
        double win_rate;
        int win_big_one;
        int weight;
    };
    
    bool cmp(boxer a, boxer b) {
        if (a.win_rate == b.win_rate) {
            if (a.win_big_one == b.win_big_one) {
                if (a.weight == b.weight) {
                    return a.num < b.num;
                }
                return a.weight > b.weight;
            }
            return a.win_big_one > b.win_big_one;
        }
        return a.win_rate > b.win_rate;
    }
    
    vector<int> solution(vector<int> weights, vector<string> head2head) {
        vector<int> answer;
        int len = weights.size();
        vector<boxer> v;
        
        for (int i = 0; i < len; i++) {
            int total = 0, win = 0, upset = 0;
            for (int j = 0; j < head2head[i].length(); j++) {
                if (head2head[i][j] == 'W') {
                    win++;
                    total++;
                    if (weights[i] < weights[j]) {
                        upset++;
                    }
                } else if (head2head[i][j] == 'L') {
                    total++;
                } else if (head2head[i][j] == 'N') {
                    continue;
                }
            }
            double winRate = (double) win/total;
            if (total == 0) {
                winRate = 0;
            }
            v.push_back({ i + 1, winRate, upset, weights[i] });
        }
        sort(v.begin(), v.end(), cmp);
        
        for (auto b : v) {
            answer.push_back(b.num);
        }
        return answer;
    }

    結果



    フィードバック


    これは比較的簡単な問題です.