어흥

[프로그래머스] 복서 정렬하기 (C++) 본문

알고리즘/프로그래머스

[프로그래머스] 복서 정렬하기 (C++)

라이언납시오 2021. 9. 10. 18:21
728x90
반응형

문제 링크: https://programmers.co.kr/learn/courses/30/lessons/85002

 

코딩테스트 연습 - 6주차

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

programmers.co.kr

1. 주의할 점

- 승률을 소수점도 포함한다

- 승률을 계산할 때, 이긴횟수와 진 횟수를 통해 계산한다(N 포함x)

 

2. 구현

- Info 구조체를 통해 각 정보를 저장한다

- Cmp operator를 통해 우선순위큐의 정렬 방법을 설정한다

- 각 선수들의 정보를 계산하여 우선순위큐에 넣고, 다 끝났으면 1개씩 빼면서 Answer 벡터에 순위를 저장한다

#include <string>
#include <vector>
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
struct info{
    float winRate = 0.0f;
    int winHeavyPlayer,weight,idx;
};
struct cmp{
    bool operator()(info &a, info &b){
        if(a.winRate==b.winRate){
            if(a.winHeavyPlayer==b.winHeavyPlayer){
                if(a.weight==b.weight)  return a.idx > b.idx;   
                return a.weight < b.weight;
            }
            return a.winHeavyPlayer < b.winHeavyPlayer;
        }
        return a.winRate < b.winRate;
    }
};

vector<int> solution(vector<int> weights, vector<string> head2head) {
    vector<int> answer;
    priority_queue<info,vector<info>,cmp> pq;
    int num = head2head.size();
    
    for(int i=0;i<num;i++){
        string str = head2head[i];
        int win = 0;
        int lose = 0;
        int heavyPlayer = 0;
        for(int j=0;j<str.size();j++){
            char c = str[j];
            if(c=='W'){
                win++;
                if(weights[i]<weights[j]) heavyPlayer++;
            }
            else if(c=='L') lose++;
        }
        float rate;
        if(win+lose==0) rate=0;
        else rate = (float)win/(win+lose);
        pq.push({rate,heavyPlayer,weights[i],i});
    }
    int cnt=1;
    while(!pq.empty()){
        answer.push_back(pq.top().idx+1);
        pq.pop();
    }
    return answer;
}
728x90
반응형
Comments