[Programmers] 복서 정렬하기

김민석·2021년 10월 7일
0

프로그래머스

목록 보기
22/30

복서의 승률과 여러 조건을 비교하여 순서대로 출력하는 문제이다.

문제 풀이 전략

위의 표를 보고 생각을 하면 쉽게 접근이 가능하다.

경기를 치른 횟수와 이긴 횟수, 자신보다 무거운 상대를 이긴 횟수를 모두 구한 후 이것을 토대로 승률까지 구한다.

algorithm 헤더파일에 존재하는 sort 함수는 작은것부터 정렬하고, 같은 경우는 다음 요소를 비교하여 정렬하는 특성이 있다.

따라서 (-승률, -무거운상대이긴횟수, -몸무게, 번호) 순으로 저장을 한 후 sort를 사용하면 승률이 높은것부터, 상대를 이긴횟수가 많은것부터, 몸무게가 무거운것부터, 번호가 작은것 부터 정렬이 된다.
(-붙이면 클수록 작아지니까)

코드

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

using namespace std;

vector<int> solution(vector<int> weights, vector<string> head2head) {
    vector<int> answer;
    vector<pair<pair<float,int>,pair<int,int>>> v;
    for(int i=0;i<weights.size();i++){
        int w = 0;
        int n = 0;
        int cnt = 0;
        for(int j=0;j<head2head.size();j++){
            if(i == j)
                continue;
            if(head2head[i][j] == 'N')
                continue;
            cnt++;
            if(head2head[i][j] == 'W'){
                w++;
                if(weights[i] < weights[j])
                    n++;
            }
        }
        float rate;
        if(cnt == 0)
            rate = 0;
        else
            rate = (float)w/(float)cnt;
        v.push_back(make_pair(make_pair(-rate,-n),make_pair(-weights[i],i+1)));
    }
    sort(v.begin(), v.end());
    for(int i=0;i<v.size();i++){
        answer.push_back(v[i].second.second);
    }
    return answer;
}

출처 : https://programmers.co.kr/learn/courses/30/lessons/85002

profile
김민석의 학습 정리 블로그

0개의 댓글