[백준] #23246번 Sport Climbing Combined (C++)

오진서·2022년 5월 14일
2

문제

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

접근 방식

2021 icpc 인터넷 예선 I번 문제이다.

선수의 등번호는 고유의 번호(key)이고 각 선수의 점수(value)에 따라 정렬해서 등번호를 출력해야 되기 때문에 stl map을 사용하였다.

문제는 두 선수의 곱한 점수가 같을 때를 고려해야 되는데 이 때, 합산 점수와 곱한 점수가 둘 다 필요하므로 map value 값으로 pair문으로 선언하였다.

C++ stl map은 value 값 기준으로 정렬이 따로 제공되지 않아 map의 요소들을 vector로 옮겨서 정렬해야한다. 그 다음 stl sort를 사용해서 3번째 인자로 comp함수를 문제의 조건에 맞게 작성하면 어렵지 않게 풀 수 있다.

코드

#include<bits/stdc++.h>
using namespace std;

int n;
map<int, pair<int, int>> m;

static bool comp(pair<int, pair<int, int>>& a, pair<int, pair<int, int>>& b) {
	if (a.second.first == b.second.first) {
		if (a.second.second == b.second.second) {
			return a.first < b.first;
		}
		else {
			return a.second.second < b.second.second;
		}
	}
	return a.second.first < b.second.first;
}

int main() {
	cin >> n;

	for (int i = 0; i < n; i++) {
		int b, p, q, r;

		cin >> b >> p >> q >> r;

		m.insert({ b, {p * q * r, p + q + r} });
	}

	vector<pair<int, pair<int, int>>> v(m.begin(), m.end());

	sort(v.begin(), v.end(), comp);

	for (int i = 0; i < 3; i++) {
		cout << v[i].first << " ";
	}
}
profile
안녕하세요

0개의 댓글