Notice
Recent Posts
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
29 | 30 | 31 |
Tags
- 약참조
- 알고리즘
- stl
- BFS
- 스마트포인터
- unorder_map
- 정렬알고리즘
- C++
- 자료구조
- 크리티컬섹션
- 델리게이트
- 선택정렬
- dataasset
- 강참조
- 정렬
- 람다
- enumasByue
- 람다사용정렬
- 언리얼엔진구조체
- C++최적화
- 데이터애셋
- 애셋로드
- UE_LOG
- moreeffectiveC++
- UELOG
- 프로그래머스
- 언리얼가비지컬렉터
- map
- UML관련
- UE4 커스텀로그
Archives
- Today
- Total
기억을 위한 기록들
[프로그래머스 lv 1 ] - 6주차 본문
https://programmers.co.kr/learn/courses/30/lessons/85002
비교를 계속 이상하게 해서 좀 삽질을 했다. 그래서 조건을 저렇게 그대로 다 주석으로 씀
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
struct PlayerInfo
{
PlayerInfo()
{
playerIndex = -1;
winRate = 0.0;
betterMeCnt = 0;
weight = 0;
}
int playerIndex;
double winRate;
int betterMeCnt;
int weight;
};
bool cmp( const PlayerInfo&a, const PlayerInfo&b )
{
//1. 전체 승률이 높은 복서의 번호가 앞쪽으로 갑니다. 아직 다른 복서랑 붙어본 적이 없는 복서의 승률은 0%로 취급합니다.
if( a.winRate > b.winRate )
{
return true;
}
//2 승률이 동일한 복서의 번호들 중에서는 자신보다 몸무게가 무거운 복서를 이긴 횟수가 많은 복서의 번호가 앞쪽으로 갑니다.
if( a.winRate == b.winRate && a.betterMeCnt > b.betterMeCnt )
{
return true;
}
//3. 자신보다 무거운 복서를 이긴 횟수까지 동일한 복서의 번호들 중에서는 자기 몸무게가 무거운 복서의 번호가 앞쪽으로 갑니다.
if( a.winRate == b.winRate && a.betterMeCnt == b.betterMeCnt && a.weight > b.weight )
{
return true;
}
//4. 자기 몸무게까지 동일한 복서의 번호들 중에서는 작은 번호가 앞쪽으로 갑니다.
if( a.winRate == b.winRate && a.betterMeCnt == b.betterMeCnt && a.weight == b.weight && a.playerIndex < b.playerIndex )
{
return true;
}
return false;
}
vector<int> solution( vector<int> weights, vector<string> head2head ) {
int size = head2head.size();
vector<PlayerInfo> players;
for( int i = 0; i < size; i++ )
{
double winCnt = 0;
int better = 0;
double round = 0;
PlayerInfo curPlayer;
for( int j = 0; j < size; j++ )
{
if( i != j )
{
if( head2head[i][j] != 'N' ) //N이 아니여야 라운드진행
{
round++;
}
if( head2head[i][j] == 'W' )//이긴 사람 세기
{
winCnt++;
if( weights[i] < weights[j] )//이긴 사람중 나보다 무거운 사람 세기
{
better++;
}
}
}
}
curPlayer.winRate = winCnt == 0 ? 0.0 : ( winCnt / round ); //이긴횟수가 0번이라면 승률 0%
curPlayer.betterMeCnt = better; //현재선수보다 무거운 사람 몇명인지
curPlayer.weight = weights[i]; //현재선수 몸무게
curPlayer.playerIndex = i + 1; //현재선수 인덱스 번호
players.push_back( curPlayer );
}
vector<int> answer;
//cmp 함수 정렬
sort( players.begin(), players.end(), cmp );
for( auto value : players )
{
answer.push_back( value.playerIndex );
}
return answer;
}
'Coding Test - cpp > Sort' 카테고리의 다른 글
[HackerRank/C++] Big Sorting (0) | 2021.07.01 |
---|---|
[프로그래머스 lv 2 ] - 가장 큰 수 (0) | 2021.04.21 |
[프로그래머스 lv 1 ] - K번째수 (0) | 2021.04.21 |
[백준 10867: 중복 빼고 정렬하기] - C++ (0) | 2021.03.24 |
[백준 2108: 통계학] - C++ (0) | 2021.03.15 |