알고리즘/문제 풀이

백준 8979 - 올림픽(C++)

qqlzzb 2022. 6. 23. 18:43

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

 

8979번: 올림픽

입력의 첫 줄은 국가의 수 N(1 ≤ N ≤ 1,000)과 등수를 알고 싶은 국가 K(1 ≤ K ≤ N)가 빈칸을 사이에 두고 주어진다. 각 국가는 1부터 N 사이의 정수로 표현된다. 이후 N개의 각 줄에는 차례대로 각

www.acmicpc.net

풀이

벡터의 배열을 만들어서 각 나라별로 메달 수를 저장했다. 처음에는 각 메달에 가중치를 곱해서 구하려고 했는데 그렇게 되면 금메달을 하나도 못 받아도 동메달을 많이 받으면 등수가 높아지므로 문제에 맞지 않다.

 

따라서 금은동 순서대로 벡터에 저장하고, 미리 k번째 나라의 금은동 개수를 배열에 저장해 둔다. 이 배열과 모든 벡터를 비교하면 된다. 금메달 개수부터 확인해가면서 금메달 수가 많으면 등수를 증가시키고, 금메달 수가 같다면 은메달 수를 확인한다. 은메달 수도 같다면 동메달까지 확인하며 등수를 증가시킨다.

 

처음에는 아무 생각 없이 벡터 배열의 크기를 1000으로 잡아뒀는데, 국가의 개수는 1~1000까지고, v[0]은 사용하지 않기 때문에 1001 이상으로 크기를 지정해줘야 한다. 그렇지 않으면 런타임 에러가 발생한다..

 

코드

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

int main()
{
	int n, k;
	cin >> n >> k;
	vector<int> v[1002];
	int karr[3];
	int res = 1;

	for (int i = 0; i < n; i++)
	{
		int cn;
		cin >> cn;
		for (int j = 0; j < 3; j++)
		{
			int a;
			cin >> a;
			if (cn == k) karr[j] = a;
			v[cn].push_back(a);
		}
	}
	for (int i = 1; i <= n; i++)
	{
        if(i==k) continue;
		if (v[i][0] > karr[0]) res++;
		else if (v[i][0] == karr[0])
		{
			if (v[i][1] > karr[1]) res++;
			else if (v[i][1] == karr[1])
			{
				if (v[i][2] > karr[2]) res++;
			}
		}
	}
	cout << res;
}