본문 바로가기

알고리즘

[백준] 23246번 Sport Climbing Combined C++ 문제풀이

https://www.acmicpc.net/problem/23246

 

23246번: Sport Climbing Combined

입력은 표준입력을 사용한다. 첫째 줄에 선수의 명수를 나타내는 양의 정수 $n$ ($3 \le n \le 100$)이 주어진다. 이어 $n$개의 줄 각각에 네 정수 $b_i$, $p_i$, $q_i$, $r_i$가 주어지는데, $b_i$는 $i$번째 선수

www.acmicpc.net

문제 풀이

compare함수를 이용해 sort를 할 때 곱한 점수, 더한 점수를 고려해 sort를 해주었다.

vector에는 id,(곱한점수, 더한점수)를 저장했다.

소스 코드

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

vector<pair<int, pair<int, int>>> player;

bool compare(pair<int, pair<int, int>> a, pair<int, pair<int, int>>b) {
	if (a.second.first < b.second.first) {
		return true;
	}
	else if (a.second.first == b.second.first) {
		if (a.second.second < b.second.second)
			return true;
		else if (a.second.second == b.second.second) {
			if (a.first < b.first)
				return true;
			else
				return false;
		}
			return false;
	}
	else
		return false;
}

int main() {
	int n;
	cin >> n;
	//입력을 받는 작업
	for (int i = 0; i < n; i++) {
		int p, q, r, z;
		cin >> p >> q >> r >> z;
		int mul = q * r * z;
		int sum = q + r + z;
		player.push_back(make_pair(p, make_pair(mul, sum)));
	}

	//compare를 이용한 정렬
	sort(player.begin(), player.end(), compare);
	
	//출력
	for (int i = 0; i < 3; i++) {
		cout << player[i].first << '\n';
	}
}