반응형
✏️ 문제 링크
https://programmers.co.kr/learn/courses/30/lessons/85002?language=cpp
✏️ 문제 설명 (더보기 클릭 👆🏻)
더보기
복서 선수들의 몸무게 weights와, 복서 선수들의 전적을 나타내는 head2head가 매개변수로 주어집니다. 복서 선수들의 번호를 다음과 같은 순서로 정렬한 후 return 하도록 solution 함수를 완성해주세요.
- 전체 승률이 높은 복서의 번호가 앞쪽으로 갑니다. 아직 다른 복서랑 붙어본 적이 없는 복서의 승률은 0%로 취급합니다.
- 승률이 동일한 복서의 번호들 중에서는 자신보다 몸무게가 무거운 복서를 이긴 횟수가 많은 복서의 번호가 앞쪽으로 갑니다.
- 자신보다 무거운 복서를 이긴 횟수까지 동일한 복서의 번호들 중에서는 자기 몸무게가 무거운 복서의 번호가 앞쪽으로 갑니다.
- 자기 몸무게까지 동일한 복서의 번호들 중에서는 작은 번호가 앞쪽으로 갑니다.
제한사항
- weights의 길이는 2 이상 1,000 이하입니다.
- weights의 모든 값은 45 이상 150 이하의 정수입니다.
- weights[i] 는 i+1번 복서의 몸무게(kg)를 의미합니다.
- head2head의 길이는 weights의 길이와 같습니다.
- head2head의 모든 문자열은 길이가 weights의 길이와 동일하며, 'N', 'W', 'L'로 이루어진 문자열입니다.
- head2head[i] 는 i+1번 복서의 전적을 의미하며, head2head[i][j]는 i+1번 복서와 j+1번 복서의 매치 결과를 의미합니다.
- 'N' (None)은 두 복서가 아직 붙어본 적이 없음을 의미합니다.
- 'W' (Win)는 i+1번 복서가 j+1번 복서를 이겼음을 의미합니다.
- 'L' (Lose)는 i+1번 복사가 j+1번 복서에게 졌음을 의미합니다.
- 임의의 i에 대해서 head2head[i][i] 는 항상 'N'입니다. 자기 자신과 싸울 수는 없기 때문입니다.
- 임의의 i, j에 대해서 head2head[i][j] = 'W' 이면, head2head[j][i] = 'L'입니다.
- 임의의 i, j에 대해서 head2head[i][j] = 'L' 이면, head2head[j][i] = 'W'입니다.
- 임의의 i, j에 대해서 head2head[i][j] = 'N' 이면, head2head[j][i] = 'N'입니다.
입출력 예
weights / head2head / result[50,82,75,120] | ["NLWL","WNLL","LWNW","WWLN"] | [3,4,1,2] |
[145,92,86] | ["NLW","WNL","LWN"] | [2,3,1] |
[60,70,60] | ["NNN","NNN","NNN"] | [2,1,3] |
입출력 예 설명
입출력 예 #1
- 다음은 선수들의 정보를 나타낸 표입니다.
1번 | - | 패배 | 승리 | 패배 | 33.33% | 1회 | 50kg |
2번 | 승리 | - | 패배 | 패배 | 33.33% | 0회 | 82kg |
3번 | 패배 | 승리 | - | 승리 | 66.66% | 2회 | 75kg |
4번 | 승리 | 승리 | 패배 | - | 66.66% | 0회 | 120kg |
- 본문에 서술된 우선순위를 따라 [3,4,1,2] 를 return 합니다.
입출력 예 #2
- 다음은 선수들의 정보를 나타낸 표입니다.
1번 | - | 패배 | 승리 | 50% | 0회 | 145kg |
2번 | 승리 | - | 패배 | 50% | 1회 | 92kg |
3번 | 패배 | 승리 | - | 50% | 1회 | 86kg |
- 본문에 서술된 우선순위를 따라 [2,3,1] 을 return 합니다.
입출력 예 #3
- 다음은 선수들의 정보를 나타낸 표입니다.
1번 | - | - | - | 0% (무전적) | 0회 | 60kg |
2번 | - | - | - | 0% (무전적) | 0회 | 70kg |
3번 | - | - | - | 0% (무전적) | 0회 | 60kg |
- 본문에 서술된 우선순위를 따라 [2,1,3] 을 return 합니다.
✏️ 문제 풀이
정렬을 겁나 하면 됐던 문제인데... 흑
정렬에 필요한 네가지 정보를 모두 넣고 sort 함수를 커스터마이즈 하면됐었다. 지금 생각해보면 vector로 넣어서 하면 더 깔끔했을 것 같다.
✏️ 문제 코드
#include <bits/stdc++.h>
using namespace std;
bool cmp(pair<pair<int, int> ,pair<int, int>> pa,pair<pair<int, int> ,pair<int, int>> pb){
int a=pa.first.first; int b=pb.first.first;
double w_p_pa=pa.first.second; double w_p_pb=pb.first.second;
int w_h_p_pa=pa.second.first; int w_h_p_pb=pb.second.first;
int w_pa=pa.second.second; int w_pb=pb.second.second;
if(w_p_pa==w_p_pb){//승률 동일
if(w_h_p_pa==w_h_p_pb){//이긴 횟수 동일
if(w_pa==w_pb){//몸무게 동일
return a < b; //작은 번호 순
}
return w_pa > w_pb;
}
return w_h_p_pa > w_h_p_pb;
}
return w_p_pa > w_p_pb;
}
vector<int> solution(vector<int> weights, vector<string> head2head) {
vector<int> answer;
vector<pair< pair<int, int> , pair<int, int>>> sort_head;
for(int i=0; i<head2head.size();i++){
//caculate win perceentage
string h=head2head[i];
vector<char> v_h(h.begin(), h.end());
int w=count(h.begin(), h.end(),'W' );//이긴 횟수
int l=count(h.begin(), h.end(), 'L' );//진횟수
double w_p=0;
int w_h_p =0;
if(w+l!=0){
w_p=(double(w)/double(w+l))*10000000;
for(int j=0; j<head2head.size(); j++){
if(h[j]=='N')continue;
if(weights[j]>weights[i] && h[j]=='W')w_h_p++;
}}
pair<int, int> p1={i + 1, w_p};
pair<int, int> p2={w_h_p, weights[i]};
pair<pair<int, int>, pair<int, int>> pp= {p1, p2};
sort_head.push_back(pp);
}
sort(sort_head.begin(), sort_head.end(), cmp);
for(int i=0; i<sort_head.size();i++){
answer.push_back(sort_head[i].first.first);
}
return answer;
}
⭐ if feedback and question : comment please⭐
반응형
'Algorithm 💫 > Problem Solving' 카테고리의 다른 글
[백준] 15649번: N과 M(1) - 1~N로 길이가 M인 수열 구하기 (0) | 2021.09.13 |
---|---|
[백준]14888번: 연산자 끼워넣기 / C++ (0) | 2021.09.13 |
[백준] 16113번: 시그널 / C++ (0) | 2021.09.10 |
[백준] 3568번: iSharp / C++ (0) | 2021.09.10 |
[백준] 14719번: 빗물 / C++ (0) | 2021.09.10 |
댓글