728x90
1. 문제
https://programmers.co.kr/learn/courses/30/lessons/85002#qna
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
'코딩 테스트' 카테고리의 다른 글
[프로그래머스] 표 편집 (Python) (0) | 2021.09.08 |
---|---|
[프로그래머스] 가장 먼 노드 (C++) (0) | 2021.09.08 |
[프로그래머스] 입국심사 (C++) (0) | 2021.09.08 |
[프로그래머스] 베스트앨범 (Python) (0) | 2021.09.06 |
[프로그래머스] 섬 연결하기 (C++) (0) | 2021.09.06 |
댓글