문제

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

풀이

Aha! (핵심)

  • 금은동 메달 개수를 다음처럼 한번에 나타냈다.
    숫자 하나 = M*M*gold + M*silver + 1*bronze
    --> 비교가 간편해짐.

어려웠던 점

  • M*M*gold + M*silver + 1*bronze을 처음엔 M = 10이라고 생각했는데, (백의자리, 십의자리, 일의자리로 생각) 채점결과가 자꾸 40점이 나왔다.
    --> 각 메달 개수가 10을 넘을 수 있기 때문에, 이러면 겹치는 경우가 생김.
    --> M = 1000000; //전체 메달 수의 총합은 1,000,000 이하

코드

방법1: 정렬 이용

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

typedef pair<int, long long> P;

int N, K;

bool compare(P x, P y) {
	if (x.second == y.second)
		return x.first == K;
	return x.second > y.second;
}

int findIndex(vector<P> &v, int country) { //v벡터에서 그 나라에 해당하는 인덱스 찾기
	for (int i = 0; i < v.size(); i++) {
		if (v[i].first == country)
			return i;
	}
}

int main() {
	cin >> N >> K; //국가의 수, 등수를 알고 싶은 국가
	vector<P> medal(N + 1);

	int country, gold, silver, bronze;
    long long M = 1000000; //전체 메달 수의 총합은 1,000,000 이하
	while (N--) {
		cin >> country >> gold >> silver >> bronze;
		medal.push_back( { country, M*M*gold + M*silver + 1*bronze} );
	}

	sort(medal.begin(), medal.end(), compare); //내림차순 + 같은 점수면 K나라가 우선.

	cout << findIndex(medal, K) + 1;

	return 0;
}

방법2: 정렬X, 그냥 개수 세기

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

int main() {
	int N, K; cin >> N >> K; //국가의 수, 등수를 알고 싶은 국가
	vector<longlong> medal(N + 1);

	/*입력받기*/
	int country, gold, silver, bronze;
    longlong M = 1000000; //전체 메달 수의 총합은 1,000,000 이하
	while (N--) {
		cin >> country >> gold >> silver >> bronze;
		medal[country] = M*M*gold + M*silver + bronze;
	}

	/*K보다 더 잘한 나라 개수 세기*/
	int result = 0;
	for (int i = 1; i < medal.size(); i++) {
		if (medal[i] > medal[K])
			result++;
	}
    
    /*K나라 등수 출력*/
	cout << result + 1;

	return 0;
}

0개의 댓글

Powered by GraphCDN, the GraphQL CDN