티스토리 뷰
반응형
복서들을 정해진 규칙대로 정렬하는 문제
문제의 조건
1. 복서들의 몸무게 배열 weights와 경기 전적을 나타낸 배열 head2head가 매개변수로 주어짐
2. 선수들은 주어진 몸무게 배열에 들어있는 순서대로 1번, 2번, ... 번호를 가지고 있다.
-> 선수의 번호를 구하려면 몸무게 배열 인덱스+1 해주어야 함
3. 복서 정렬 조건
1) 승률이 높은 복서가 앞에 온다. -> 내림차순
2) 승률이 같다면 자기보다 몸무게가 무거운 복서를 이긴 횟수가 많은 복서가 앞에 온다. -> 내림차순
3) 2)에서 자기보다 무거운 복서를 이긴 횟수도 같으면 몸무게가 더 무거운 복서가 앞에 온다. -> 내림차순
4) 3)에서 몸무게도 같으면 번호가 빠른 사람이 앞에 온다. -> 오름차순
=> 위의 조건대로 compare 함수를 작성해야 함
4. 주어진 조건대로 나열한 순서를 배열에 담아서 리턴
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
bool compare(const vector<float>& v1, const vector<float>& v2)
{
if (v1.front() > v2.front())
return true;
if (v1.front() == v2.front() && v1[1] > v2[1])
return true;
if (v1.front() == v2.front() && v1[1] == v2[1] && v1[2] > v2[2])
return true;
if (v1.front() == v2.front() && v1[1] == v2[1] && v1[2] == v2[2] && v1[3] < v2[3])
return true;
return false;
}
vector<int> solution(vector<int> weights, vector<string> head2head) {
vector<vector<float>> vecWinnings(weights.size()); //복서들의 승리 정보를 저장할 배열
for (int i = 0; weights.size() > i; i++)
{
float winningCount = 0;
float roundCount = 0;
float heavyCount = 0;
for (int j = 0; head2head[i].length() > j; j++)
{
if (i != j)
{
//이겼으면 카운트를 증가시키는데 자기보다 무거운 복서를 이겼으면 그에 대한 카운트 추가로 증가
if ('W' == head2head[i][j])
{
roundCount++;
winningCount++;
if (weights[j] > weights[i])
heavyCount++;
}
//졌을 때엔 경기 횟수 카운트만 증가
else if ('L' == head2head[i][j])
roundCount++;
}
}
//승률 = 이긴 횟수 / 경기 횟수
float rate;
if (0 == roundCount)
rate = 0; //경기 한 적이 없으면 승률 0
else
rate = winningCount / roundCount;
//[승률, 자기보다 무거운 복서를 이긴 횟수, 몸무게, 번호] 순서로 저장
vecWinnings[i].emplace_back(rate);
vecWinnings[i].emplace_back(heavyCount);
vecWinnings[i].emplace_back(weights[i]);
vecWinnings[i].emplace_back(i+1);
}
sort(vecWinnings.begin(), vecWinnings.end(), compare);
vector<int> answer;
for (int i = 0; weights.size() > i; i++)
answer.emplace_back(vecWinnings[i][3]);
return answer;
}
반응형
'알고리즘 문제 풀이' 카테고리의 다른 글
[C++] 프로그래머스 상호 평가 풀이 (0) | 2021.10.05 |
---|---|
[C++] 프로그래머스 직업군 추천하기 풀이 (0) | 2021.10.03 |
[C++] 프로그래머스 2016 풀이 (0) | 2021.10.01 |
[C++] 프로그래머스 두 개 뽑아서 더하기 풀이 (0) | 2021.10.01 |
[C++] 프로그래머스 예산 풀이 (0) | 2021.09.30 |
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 캐나다
- c++
- greedy
- c언어
- 기초
- 캐나다생활
- 컴퓨터
- 코딩공부
- hackerrank
- 프로그래머스
- 알고리즘
- 프로그래밍
- 애플
- C언어기초
- 깊이우선탐색
- 하드웨어
- 영어공부
- 백준
- 스위프트플레이그라운드
- 컴퓨터사이언스
- 너비우선탐색
- 문제풀이
- 다이나믹프로그래밍
- 해커랭크
- 컴퓨터공부
- BFS
- DFS
- dp
- 아이패드
- 그리디
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
글 보관함