본문 바로가기

Language/C++

[프로그래머스][위클리 챌린지 - 6주차][sort] 복서 정렬하기 - 컴도리돌이

728x90
728x90
 

코딩테스트 연습 - 6주차

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

programmers.co.kr

 

  • sort 함수를 사용하기 위해서 벡터 함수 안에 모든 값을 저장하였다. {{선수의 몸무게, idx 값},{ 승률,자신의 몸무게보다 큰 선수를 이긴 횟수}} 
  • 비교함수에 따른 sort를 하였다. 승률이 같지 않으면 승률에 따른 정렬. 승률이 같으면 자신의 몸무게보다 큰 선수를 이긴 횟수가 같지 않으면 그에 따른 정렬..... 마지막 idx 값이 작은 순으로 정렬.

 

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

using namespace std;
bool compare(pair<pair<int,int>,pair<double,int>> p1,pair<pair<int,int>,pair<double,int>> p2)
{
    if(p1.second.first == p2.second.first)
    {
        if(p1.second.second == p2.second.second)
        {
            if(p1.first.first == p2.first.first) return p1.first.second < p2.first.second;
            return p1.first.first > p2.first.first;
        }
        return p1.second.second > p2.second.second;
    }
    return p1.second.first > p2.second.first;
}

vector<int> solution(vector<int> weights, vector<string> head2head) {
    vector<int> answer;
    vector<pair<pair<int,int>,pair<double,int>>> player;
    for(int i=0 ;i <weights.size() ; i++) player.push_back({{weights[i],i+1},{0,0}});
    for(int i=0,total= weights.size(); i<head2head.size(); i++,total= weights.size())
    {
        string s = head2head[i];
        double win = 0,win_over_weight= 0,my_weight = player[i].first.first;
        for(int j=0; j< s.length(); j++)
        {
            if(s[j] == 'N') total--;
            if(s[j] == 'W')
            {
               if(my_weight < player[j].first.first) win_over_weight++;
                win ++; 
            }
            else continue;
        }
        if(total == 0) player[i].second = {0,win_over_weight};
        else player[i].second = {win / total,win_over_weight};
    }
    
    sort(player.begin(),player.end(),compare);
    
    for(auto p : player) answer.push_back(p.first.second);
    return answer;
}
728x90
728x90