반응형
https://programmers.co.kr/learn/courses/30/lessons/85002
정렬 및 구현문제였습니다.
📕 풀이방법
📔 입력 및 초기화
승률, 자기자신보다 무거운 복서를 이긴 횟수, 선수 번호를 저장할 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;
}
'Algorithm > Sorting' 카테고리의 다른 글
(C++) - 백준(BOJ) 18411 : 試験 (Exam) (0) | 2021.11.03 |
---|---|
(C++) - 프로그래머스(위클리 챌린지) : 8주차_최소직사각형 (0) | 2021.10.22 |
(C++) - 백준(BOJ) 20207번 : 달력 (0) | 2021.08.16 |
(C++) - 프로그래머스(2018 KAKAO BLIND RECRUITMENT[3차]) : 파일명 정렬 (0) | 2021.05.14 |
(C++) - 백준(BOJ) 11497번 : 통나무 건너뛰기 (0) | 2021.05.01 |