Computer Science/Algorithm Problem

백준] 11637 - 인기 투표(ACM-ICPC Regional)

TwinParadox 2018. 2. 3. 17:04
728x90

시간 제한 : 2초

메모리 제한 : 256MB




입력

맨 위 첫번째 줄에 T(1 <T< 500)는 테스트케이스 수를 의미한다. 각 테스트 케이스의 첫번째 줄에는 n이 주어지고 n은 후보자 수를 의미하며, 다음 n줄에는 순서대로 각 후보자가 받은 득표 수를 입력받는다.

후보자는 최소 2명에서 10명보다 많지 않으며, 득표 수는 50000표를 넘지 않으며, 후보자들은 분명 자기 자신을 찍기 때문에 최소 1표 이상은 받게된다.




출력

각 테스트 케이스는 첫번째 줄부터 순서대로 출력된다. 최다 득표자가 과반수 득표를 했을경우에는 "majority winner R", 절반 이하의 득표를 하였을 경우엔 "minority winner R"가 되며, 최다 득표자가 없을때(최다 득표자가 1명 초과일 경우)  "no winner"를 출력한다. 이때 R은 최다 득표자의 후보자 번호를 의미하며, 후보자의 번호는 각 케이스에서 1, 2, . . . , n 으로 부여된다.




소스코드

#include <iostream>
#include <algorithm>
using namespace std;
int main(void)
{
	int t;
	cin >> t;
	while (t--)
	{
		int n, arr[10], sum = 0, maj = -1, majIdx;
		cin >> n;	
		for (int i = 0; i < n; i++)
		{
			cin >> arr[i];
			sum += arr[i];
			if (maj < arr[i])
				maj = arr[i], majIdx = i;
		}
		sort(arr, arr + n);
		if (maj == arr[n - 2])
			cout << "no winner\n";
		else if (maj > (double)sum / 2)
			cout << "majority winner " << majIdx + 1 << '\n';
		else
			cout << "minority winner " << majIdx + 1 << '\n';
	}
}




Tip

아주 간단한 문제로, 위 풀이 방법보다는 전체적으로 한 번 정렬 후 첫번째 최댓값과, 두번째 최댓값을 비교 계산하는 것을 추천한다.



728x90