피너클의 it공부방

백준 8979 올림픽 (c++) : 피너클 본문

백준

백준 8979 올림픽 (c++) : 피너클

피너클 2025. 9. 16. 00:05
728x90
반응형

8979번: 올림픽

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

 

그냥 정렬 문제다.

 

long long n, k;
vector<tuple<long long, long long, long long, int>> v;

사용할 변수다.

v에는 <금메달, 은메달, 동메달, 번호> 가 들어간다.

 

int main()
{
	cin >> n >> k;
	for (int i = 1; i <= n; i++) {
		long long a, b, c, d;
		cin >> a >> b >> c >> d;
		v.push_back(make_tuple(b, c, d, a));
	}
	long long sum = 0;
	sort(v.begin(), v.end(), cmp);
	for (long long i = 0; i < n; i++) {
		if (get<3>(v[i]) == k) break;

		sum++;
	}
	cout << sum + 1 << endl;
}

그냥 입력받고 정렬하고 번호가 k가 나올때까지 반복문 돌린뒤

sum+1을 출력하면 된다.

 

bool cmp(tuple<long long, long long, long long, int>a, tuple<long long, long long, long long, int>b) {
	if (get<0>(a) > get<0>(b)) return true;
	else if (get<0>(a) < get<0>(b)) return false;
	else {
		if (get<1>(a) > get<1>(b)) return true;
		else if (get<1>(a) < get<1>(b)) return false;
		else {
			if (get<2>(a) > get<2>(b)) return true;
			else if(get<2>(a) < get<2>(b)) return false;
			else {
				if (get<3>(a) == k) return true;
				else return false;
			}
		}
	}
}

정렬할땐 위처럼 비교해서 정렬한다.

그냥 금메달 더 많은놈, 은메달 더 많은놈, 동메달 더 많음놈 이렇게 가면 된다.

하지만 마지막에

			else {
				if (get<3>(a) == k) return true;
				else return false;
			}
		}
	}
}

금 은 동 전부 같은 경우에는 k가 무조건 앞으로 가게 해주면 된다.

이렇게 하면 금 은 동 전부 같은 놈들 중에는 k가 맨 앞으로 가게 된다.

 

그럼 자연스럽게 성립된다.

 

#include <iostream>
#include <vector>
#include <algorithm>
#include <tuple>

using namespace std;

long long n, k;
vector<tuple<long long, long long, long long, int>> v;

bool cmp(tuple<long long, long long, long long, int>a, tuple<long long, long long, long long, int>b) {
	if (get<0>(a) > get<0>(b)) return true;
	else if (get<0>(a) < get<0>(b)) return false;
	else {
		if (get<1>(a) > get<1>(b)) return true;
		else if (get<1>(a) < get<1>(b)) return false;
		else {
			if (get<2>(a) > get<2>(b)) return true;
			else if(get<2>(a) < get<2>(b)) return false;
			else {
				if (get<3>(a) == k) return true;
				else return false;
			}
		}
	}
}

int main()
{
	cin >> n >> k;
	for (int i = 1; i <= n; i++) {
		long long a, b, c, d;
		cin >> a >> b >> c >> d;
		v.push_back(make_tuple(b, c, d, a));
	}
	long long sum = 0;
	sort(v.begin(), v.end(), cmp);
	for (long long i = 0; i < n; i++) {
		if (get<3>(v[i]) == k) break;

		sum++;
	}
	cout << sum + 1 << endl;
}

전체코드다.

728x90
반응형
Comments