프로그래머스(Programmers)

복서 정렬하기 C++

cosmohoo 2021. 10. 7. 23:25
반응형

문제 설명

 

 

제한사항

 

 

입출력 예

weightshead2headresult

[50,82,75,120] ["NLWL","WNLL","LWNW","WWLN"] [3,4,1,2]
[145,92,86] ["NLW","WNL","LWN"] [2,3,1]
[60,70,60] ["NNN","NNN","NNN"] [2,1,3]

 

 

입출력 예 #1

  • 다음은 선수들의 정보를 나타낸 표입니다.

선수 번호vs 1번vs 2번vs 3번vs 4번승률자기보다 무거운 복서를 이긴 횟수몸무게

1번 - 패배 승리 패배 33.33% 1회 50kg
2번 승리 - 패배 패배 33.33% 0회 82kg
3번 패배 승리 - 승리 66.66% 2회 75kg
4번 승리 승리 패배 - 66.66% 0회 120kg
  • 본문에 서술된 우선순위를 따라 [3,4,1,2] 를 return 합니다.

입출력 예 #2

  • 다음은 선수들의 정보를 나타낸 표입니다.

선수 번호             vs 1번                vs 2번                  vs 3번                  승률           자기보다 무거운 복서를 이긴 횟수        몸무게

1번 - 패배 승리 50% 0회 145kg
2번 승리 - 패배 50% 1회 92kg
3번 패배 승리 - 50% 1회 86kg
  • 본문에 서술된 우선순위를 따라 [2,3,1] 을 return 합니다

 

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

using namespace std;
struct boxer
{
    int weight=0; 
    double rateW=0.00;
    int numW=0;//본인보다 무거운 애들 이긴 횟수
    int num=0;
};

bool cmp(const boxer &B1, const boxer &B2)
{
    if(B1.rateW > B2.rateW)
    {
        return true;
    }
    if(B1.rateW == B2.rateW)
     {
        if(B1.numW > B2.numW)
        {
            return true;
        }    
        
        if(B1.numW == B2.numW)
        {
            if(B1.weight > B2.weight)
            {  
                 return true;
            }
             
            if(B1.weight == B2.weight)
            {  
                    if(B1.num < B2.num)
                {
                     return true;
                }
            }    
         }
     }
    return false;
}


vector<int> solution(vector<int> weights, vector<string> head2head) {
    vector<boxer> arr;
    for(int i=0; i<weights.size(); i++)
    {
        boxer newB;
        newB.weight = weights[i];//본인 무게 삽입
        newB.num = i+1;
        
        int numFight= 0;//총전적 횟수
        int score =0; //이긴 횟수
        int numHit =0; //나보다 무거운 애들 이긴 횟수
        for(int j=0; j<head2head.size(); j++)
        {
            if(head2head[i][j] == 'W')
            {
                numFight++;
                score++;
                if(weights[i] < weights[j])//상대가 나보다 무거우면 
                {
                    numHit++;
                }
            }
            else if(head2head[i][j] == 'L') numFight++;
        }
        if (numFight == 0) {newB.rateW = 0.00;}
        else {newB.rateW = (double)score / (double)numFight;}//승률 삽입   
        newB.numW=numHit;
        arr.push_back(newB);
    }
    sort(arr.begin(), arr.end(), cmp);    
    vector<int> answer;
    for(int i=0; i<weights.size(); i++)
    {
        answer.push_back(arr[i].num);
    }
    
    return answer;
}

 

 

=> Boxer의 특성을 표현할 수 있는 구조체를 생성하였습니다. 

 

=> 승률의 경우 소수점을 표현할 수 있도록 double으로 표현하였으며, 승률 계산 시(double) 변수 / (double) 변수를 하여 소수점을 표현할 수 있도록 하였습니다. 

 

=> 승부를 겨뤄보지 않은 경우 0으로 나눠지는 경우가 있으므로 주의해야 합니다. (core dumped error) 

 

=> algorithm 헤더에 포함되어 있는 sort 함수를 사용하여 boxer 배열을 정렬하였습니다. 

 

=> sort함수의 경우 cmp 함수를 자체적으로 생성하여 내가 원하는 sort함수를 생성할 수 있습니다. cmp 함수를 생성하여 Boxer 배열 정렬을 시행하였습니다. 

 

 

반응형