알고리즘 문제풀이/프로그래머스

[프로그래머스/위클리 챌린지] 6주차 (C++)

노력의천재 2021. 10. 6. 15:49

https://programmers.co.kr/learn/courses/30/lessons/85002

 

코딩테스트 연습 - 6주차_복서 정렬하기

복서 선수들의 몸무게 weights와, 복서 선수들의 전적을 나타내는 head2head가 매개변수로 주어집니다. 복서 선수들의 번호를 다음과 같은 순서로 정렬한 후 return 하도록 solution 함수를 완성해주세요

programmers.co.kr

어렵지않은 구현 + 정렬 문제였다. 주의할 점은 복싱 시합 결과가 'N'일 때는 전체 경기 횟수로 포함되지 않는다는 점, 그리고 나누는 수가 0이될 때 따로 예외처리를 해줘야하는 점이다.

 

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

struct Boxer {
    int num, underdog, weight;
    double win_rate;
};

vector<Boxer> boxers;

int cmp(const Boxer &a, const Boxer &b) {
    if(a.win_rate == b.win_rate) {
        if(a.underdog == b.underdog) {
            if(a.weight == b.weight) return a.num < b.num;
            return a.weight > b.weight;
        }
        return a.underdog > b.underdog;
    }
    return a.win_rate > b.win_rate;
}

vector<int> solution(vector<int> weights, vector<string> head2head) {
    int n = weights.size();
    vector<int> answer(n);
    
    for(int i = 0; i < n; i++) {
        int win_cnt = 0, total_cnt = n, underdog = 0;
        
        for(int j = 0; j < n; j++) {
            if(head2head[i][j] == 'W') {
                win_cnt++;
                if(weights[i] < weights[j]) underdog++;
            // N은 total_cnt로 세지 않는다.
            } else if(head2head[i][j] == 'N') total_cnt--;    
        }
        
        double win_rate;
        if(total_cnt == 0) win_rate = 0;
        else win_rate = win_cnt / (double)total_cnt;
        boxers.push_back({ i + 1, underdog, weights[i], win_rate });
    }
    
    sort(boxers.begin(), boxers.end(), cmp);
    
    for(int i = 0; i < n; i++) {
        answer[i] = boxers[i].num;
    }
    
    return answer;
}