안녕하세요. 오늘은 위클리 챌린지 6 해설을 해보도록 하겠습니다.
https://programmers.co.kr/learn/courses/30/lessons/85002
해당 문제는 위 링크에서 확인하실 수 있습니다.
이 문제는 정렬을 잘 활용할 수 있는지 묻는 문제입니다.
적절한 구조체를 선언하여 리스트에 저장한 뒤, 문제의 조건에 맞추어 정렬해주시면 됩니다.
문제의 조건이
- 전체 승률이 높은 복서의 번호가 앞쪽으로 갑니다. 아직 다른 복서랑 붙어본 적이 없는 복서의 승률은 0%로 취급합니다.
- 승률이 동일한 복서의 번호들 중에서는 자신보다 몸무게가 무거운 복서를 이긴 횟수가 많은 복서의 번호가 앞쪽으로 갑니다.
- 자신보다 무거운 복서를 이긴 횟수까지 동일한 복서의 번호들 중에서는 자기 몸무게가 무거운 복서의 번호가 앞쪽으로 갑니다.
- 자기 몸무게까지 동일한 복서의 번호들 중에서는 작은 번호가 앞쪽으로 갑니다.
이기 때문에 저는 구조체에 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 |