본문 바로가기
코딩 테스트

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

by zoodi 2021. 9. 8.
728x90

1. 문제

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

 

코딩테스트 연습 - 6주차

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

programmers.co.kr

2. 풀이

문제의 기준에따라 정렬을해야하는 sorting문제.

승률을 구할때 자기자신과는 싸울 수 없어서 당연히 전체 경기 수 = 전체 복서 수 - 1 로 계산했다가

잘못 된 것을 인지하고 고쳤다.

 

경기를 안한 N도 있기때문에 전체 경기 수는 자기자신이 아니고 N인 경우를 제외한 W, L일 경우를 모두 카운트 해주어야한다. 그리고 정렬 기준대로 순서대로 정렬하면 끝!

 

3. 코드

#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
/*
# 승률 높은 순
# 무거운 복서 이긴 횟수 많은 순
# 자기 몸무게가 무거운 순
# 작은 번호 순
*/
using namespace std;

typedef struct{
    float rate;  //승률
    int win_heavy_cnt; //자기보다 무거운 복서를 이긴 횟수
    int weight; //자기 몸무게가 무거운 순
    int idx; //자기 번호가 작은 순
}Info;

bool cmp(Info a, Info b){
    if(a.rate == b.rate){
         if(a.win_heavy_cnt == b.win_heavy_cnt){
             if(a.weight == b.weight){
                return a.idx < b.idx;
            }
            return a.weight > b.weight;
        }
        return a.win_heavy_cnt > b.win_heavy_cnt;
    }
   
    return a.rate > b.rate;

}

vector<int> solution(vector<int> weights, vector<string> head2head) {
    int n = weights.size();
    vector<int> answer;
    vector<Info> result;
    
    for(int i=0; i<weights.size(); i++){
        float win_cnt = 0; //이긴 횟수
        int win_heavy_cnt = 0; //무거운 복서 이긴 횟수
        int play_cnt =0; //총 경기 횟수
        string cur = head2head[i];
        for(int j=0; j<cur.size(); j++){
            if(i == j)
                continue;
            if(cur[j] =='W'){
                win_cnt++;
                if(weights[i] < weights[j]){
                    win_heavy_cnt++;
                }
            }
            if(cur[j] != 'N')
                play_cnt++;
            
        }
        float rate = 0;
        if(play_cnt !=0)
            rate = win_cnt / play_cnt * 100;
        result.push_back({rate,win_heavy_cnt, weights[i], i+1});
        
    }
    
    sort(result.begin(), result.end(), cmp);
    
    for(Info x : result){
        //cout << x.idx << " " << x.rate << " " << x.win_heavy_cnt << " " << x.weight << " "<< endl;
        answer.push_back(x.idx);
    }

    return answer;
}
728x90

댓글