본문 바로가기

Algorithm/Programmers

[Programmers] 위클리 챌린지 6

안녕하세요. 오늘은 위클리 챌린지 6 해설을 해보도록 하겠습니다.

 

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

 

코딩테스트 연습 - 6주차

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

programmers.co.kr

 

해당 문제는 위 링크에서 확인하실 수 있습니다.

 

이 문제는 정렬을 잘 활용할 수 있는지 묻는 문제입니다.

 

적절한 구조체를 선언하여 리스트에 저장한 뒤, 문제의 조건에 맞추어 정렬해주시면 됩니다.

 

문제의 조건이 

  1. 전체 승률이 높은 복서의 번호가 앞쪽으로 갑니다. 아직 다른 복서랑 붙어본 적이 없는 복서의 승률은 0%로 취급합니다.
  2. 승률이 동일한 복서의 번호들 중에서는 자신보다 몸무게가 무거운 복서를 이긴 횟수가 많은 복서의 번호가 앞쪽으로 갑니다.
  3. 자신보다 무거운 복서를 이긴 횟수까지 동일한 복서의 번호들 중에서는 자기 몸무게가 무거운 복서의 번호가 앞쪽으로 갑니다.
  4. 자기 몸무게까지 동일한 복서의 번호들 중에서는 작은 번호가 앞쪽으로 갑니다.

이기 때문에 저는 구조체에 index, 이긴 횟수, 진 횟수, 자신보다 몸무게가 큰 사람을 이긴 횟수, 몸무게의 정보를 저장해 주었습니다.

 

 

<소스 코드>

#include <bits/stdc++.h>
using namespace std;

typedef struct boxer{
    double winCount, loseCount;
    int winHeavyCount, weight, index; 
}B;
bool cmp(B& a, B&b) {
    double aP = 0.0, bP = 0.0;
    if(a.winCount+a.loseCount != 0)aP = a.winCount/(a.winCount+a.loseCount);
    if(b.winCount+b.loseCount != 0)bP = b.winCount/(b.winCount+b.loseCount);
    
    if(aP != bP) return aP > bP;
    if(a.winHeavyCount != b.winHeavyCount) return a.winHeavyCount > b.winHeavyCount;
    if(a.weight != b.weight) return a.weight > b.weight;
    return a.index < b.index;
}
vector<int> solution(vector<int> weights, vector<string> head2head) {
    vector<int> answer;
    
    vector<B> v(weights.size()+1, {0.0, 0.0, 0, 0, 0});
    for(int i = 0; i < weights.size(); i++) {
        v[i+1].index = i+1;
        v[i+1].weight = weights[i];
    }
    
    for(int i = 0; i < head2head.size(); i++) {
        for(int j = i+1; j < head2head[i].size(); j++) {
            if(head2head[i][j] == 'W') {
                v[i+1].winCount++;
                v[j+1].loseCount++;
                
                if(weights[i] < weights[j]) v[i+1].winHeavyCount++;
            } else if(head2head[i][j] == 'L') {
                v[i+1].loseCount++;
                v[j+1].winCount++;
                
                if(weights[j] < weights[i]) v[j+1].winHeavyCount++;
            } 
        }
    }
    
    sort(v.begin(), v.end(), cmp);
    for(auto a : v) if(a.index!=0) answer.push_back(a.index);
    return answer;
}

 

*저의 글에 대한 피드백이나 지적은 언제나 환영합니다. 

'Algorithm > Programmers' 카테고리의 다른 글

[Programmers] 단속 카메라  (0) 2021.09.07
[Programmers] 섬 연결하기  (0) 2021.09.07
[Programmers] 합승 택시 요금  (0) 2021.09.02
[Programmers] 방금 그곡  (0) 2021.09.01
[Programmers] 후보키  (0) 2021.09.01