ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 복서 정렬하기 C++
    프로그래머스(Programmers) 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 배열 정렬을 시행하였습니다. 

     

     

    반응형

    '프로그래머스(Programmers)' 카테고리의 다른 글

    신규아이디 추천  (0) 2021.11.09
    최소직사각형  (0) 2021.10.14
    모음사전 C++  (0) 2021.10.07
    상호 평가  (0) 2021.09.09
    부족한 금액 계산하기 C++  (0) 2021.09.07

    댓글

Designed by Who.