728x90
https://programmers.co.kr/learn/courses/30/lessons/85002
복서들의 정보와, 전적을 통해 정렬하는 문제이다.
1. 전체 승률이 높은 순
2. 자신보다 무거운 사람을 이긴 횟수가 많은 순
3. 내 몸무게가 무거운 순
4. 번호 작은 순
으로 정렬을 하면 된다.
2중 for문을 돌면서 이긴 경우, 진 경우, 이겼는데 나보다 상대 몸무게가 무거운 경우를 세주면 된다.
난 처음에 틀렸는데 행의 개수로 승률을 나눠서 그랬다.
W L N이 있는데 N은 경기를 아예 안 한 경우로, 승률을 계산할 때 분모에 포함되면 안 된다.
또한 실수형으로 계산해줘야 정확한 승률 계산이 된다.
double형 변수 = int 연산 int를 해도 int값이 저장되는데, 형 변환을 해주어야 double형으로 잘 저장이 된다.
또한, 정렬을 어떻게 할 것인가에 대해서 방법들이 있는데
1) compare 함수를 만들어서 정의해주는 경우
2) 정렬 기준을 보면 1, 2, 3은 내림차순이고 4만 오름차순이므로 vector에 넣어줄 때 1, 2, 3번 조건에 -을 붙여주고 일반 sort를 진행하면 잘 정렬이 된다.
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
typedef pair<double, pair<int, pair<int, int>>> pdiii;
vector<pdiii> v;
vector<int> solution(vector<int> weights, vector<string> head2head) {
vector<int> answer;
double cnt = weights.size();
for(int i = 0 ; i < cnt ; i++){
int winCnt = 0; int heavyCnt = 0; int totalCnt = 0;
for(int j = 0 ; j < cnt ; j++){
if(head2head[i][j] == 'W'){// i+1이 j+1을 이김
winCnt++;
totalCnt++;
if(weights[i] < weights[j])
heavyCnt++;
}
else if(head2head[i][j] == 'L')
totalCnt++;
}
v.push_back({-winCnt / double(totalCnt), {-heavyCnt, {-weights[i], i+1}}});
}
sort(v.begin(), v.end());
for(auto a : v)
answer.push_back(a.second.second.second);
return answer;
}
728x90
'문제 풀이 > 프로그래머스 알고리즘, SQL' 카테고리의 다른 글
[프로그래머스 2019 카카오 개발자 겨울 인턴십] 불량 사용자 (DFS, 조합) [C++] (0) | 2021.10.07 |
---|---|
[프로그래머스 2021 Dev-Matching: 웹 백엔드 개발자 상반기 SQL] 헤비 유저가 소유한 장소 (0) | 2021.10.06 |
[프로그래머스 LV4] 징검다리 (이진 탐색, 매개변수 탐색) [C++] (0) | 2021.09.05 |
[프로그래머스 카카오 블라인드 채용 2021 3번] 순위 검색 (구현, 이진탐색) [C++] (0) | 2021.09.01 |
[프로그래머스 위클리 챌린지 3주차] 퍼즐 조각 맞추기 (구현, BFS) [C++] (0) | 2021.08.29 |