본문 바로가기

Algorithm/Sorting

(C++) - 프로그래머스(위클리 챌린지) : 6주차

반응형

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

 

코딩테스트 연습 - 6주차_복서 정렬하기

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

programmers.co.kr

정렬 및 구현문제였습니다.

📕 풀이방법

📔 입력 및 초기화

승률, 자기자신보다 무거운 복서를 이긴 횟수, 선수 번호를 저장할 vector 변수들을 선언합니다. 그리고 몸무게 정보도 전역변수로 이용하기 위해 따로 저장합니다. player를 weights.size()만큼 1씩 증가해 선수들의 번호를 저장해줍니다.

 

📔 풀이과정

 1. 선수번호별 해당 vector에 저장 : 선수별 승률, 자기보다 무거운 복서를 이긴 횟수를 구해 저장합니다. 이 때 단 한번도 싸우지 않은 선수에 대한 승률은 0으로 처리해야합니다. 

 

 2. 모두 저장 후에는 player를 정렬조건에 맞춰 정렬합니다.

 

📔 정답출력

정렬 된 player를 반환합니다.


📕 Code

#include <bits/stdc++.h>
using namespace std;
vector<double> winRate;
vector<int> winCnt, player, weight;

bool cmp(int a, int b){
    if(winRate[a-1] == winRate[b-1]){
        if(winCnt[a-1] == winCnt[b-1]) {
            if(weight[a-1] == weight[b-1]) return a < b;
            return weight[a-1] > weight[b-1];
        }
        return winCnt[a-1] > winCnt[b-1];
    }
    return winRate[a-1] > winRate[b-1];
}

vector<int> solution(vector<int> weights, vector<string> head2head) {
    winRate.resize(weights.size());
    winCnt.resize(weights.size());
    player.clear();
    weight = weights;

    for(int i = 0; i < weights.size(); i++) player.push_back(i+1);
    for(int i = 0; i < head2head.size(); i++){
        double win = 0;
        double totalGame = 0;
        int winHeavy = 0;
        for(int j = 0; j < head2head[i].size(); j++){
            if(i == j) continue;
            if(head2head[i][j] != 'N') totalGame++;
            if(head2head[i][j] == 'W') {
                win++;
                if(weights[i] < weights[j]) winHeavy++;
            }
        }
        if(totalGame == 0) winRate[i] = 0;
        else winRate[i] = win / totalGame * 100;
        winCnt[i] = winHeavy;
    }
    
    sort(player.begin(), player.end(), cmp);
    return player;
}