https://programmers.co.kr/learn/courses/30/lessons/85002
풀이
복서의 순서를 정렬하기 위한 기준과 우선 순위, 각 기준에서 전후가 결정나지 않으면 다음 기준으로 비교
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 |
댓글