본문 바로가기
알고리즘

Programmers - 복서 정렬하기(C++)

by 장중앙 2021. 10. 4.

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

 

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

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

programmers.co.kr

 

풀이

복서의 순서를 정렬하기 위한 기준과 우선 순위, 각 기준에서 전후가 결정나지 않으면 다음 기준으로 비교

  1. 승률 

  2. 자신보다 무거운 선수를 이긴 횟수

  3. 몸무게

  4. 번호

 

복서마다 승률, 자기보다 무거운 선수를 이긴 횟수를 계산

  - 승률의 경우 복서마다 ('W'의 갯수) / ('W', 'L'의 갯수) x 100으로 계산

 

 

 

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

using namespace std;
double win_rate[1001];
int win_to_big[1001];
vector<int> W;

bool cmp(int x, int y){
    int a=x-1;
    int b=y-1;
    if(win_rate[a]<=win_rate[b])
        if(win_rate[a]==win_rate[b])
            if(win_to_big[a]<=win_to_big[b])
                if(win_to_big[a]==win_to_big[b])
                    if(W[a]<=W[b])
                        if(W[a]==W[b])
                            if(a>b)
                                return false;
                            else
                                return true;
                        else
                            return false;
                    else
                        return true;
                else
                    return false;
            else
                return true;
        else
            return false;
    else
        return true;
}

vector<int> solution(vector<int> weights, vector<string> head2head) {
    vector<int> answer;
    for(int i=1;i<=weights.size();i++){
        answer.push_back(i);
    }
    W=weights;
    for(int i=0;i<head2head.size();i++){
    	// 복서마다 승률과, 자신보다 무거운 선수에게 이긴 횟수를 계산
        string str=head2head[i];
        int cnt=0;
        for(int j=0;j<str.size();j++){
            if(str[j]!='N')
                cnt++;
            if(str[j]=='W'){
                win_rate[i]++;
                if(weights[i]<weights[j])
                    win_to_big[i]++;
            }
        }
        if(cnt==0)
            win_rate[i]=0;
        else
            win_rate[i]=((double)win_rate[i]/cnt*100);
    }
    
   	// 기준에 대해 정렬
    sort(answer.begin(), answer.end(), cmp);
    return answer;
}

'알고리즘' 카테고리의 다른 글

BOJ 1912 - 연속합(C++)  (0) 2021.10.05
Programmers - 불량 사용장(Python)  (0) 2021.10.04
Programmers - 모음사전(Python)  (0) 2021.09.29
BOJ 3190 - 뱀(C++)  (0) 2021.09.29
Programmers - 로또의 최고 순위와 최저 순위(C++)  (0) 2021.09.29

댓글