관리 메뉴

기억을 위한 기록들

[프로그래머스 lv 1 ] - 6주차 본문

Coding Test - cpp/Sort

[프로그래머스 lv 1 ] - 6주차

에드윈H 2021. 9. 10. 23:59

https://programmers.co.kr/learn/courses/30/lessons/85002

 

코딩테스트 연습 - 6주차

복서 선수들의 몸무게 weights와, 복서 선수들의 전적을 나타내는 head2head가 매개변수로 주어집니다. 복서 선수들의 번호를 다음과 같은 순서로 정렬한 후 return 하도록 solution 함수를 완성해주세요

programmers.co.kr

 

비교를 계속 이상하게 해서 좀 삽질을 했다. 그래서 조건을 저렇게 그대로 다 주석으로 씀

 

 

#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;
}