안녕하세요. 오늘은 학급 회장을 뽑을 거예요.

문제

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

아이디어

문제에 나온 그대로 구현해줍시다.

mx를 최댓값, p를 학급회장의 번호, cnt[i][j]를 i번 후보가 받은 j점의 개수, a,b,c를 현재 학급 회장 후보가 가진 1,2,3의 개수
라고 합시다.

i를 1부터 3까지 돌리면서
mx보다 cnt[i][1]+cnt[i][2]x2+cnt[i][3]x3이 더 크면 갱신
만약 mx와 같고 cnt[i][3]이 c보다 크거나 cnt[i][3]이 c와 같고 cnt[i][2]가 b보다 크면 갱신
만약 a,b,c가 cnt[i][1],cnt[i][2],cnt[i][3]과 같으면 p=0
아니면 그냥 넘겨주면 됩니다.

소스코드

#include <iostream>
using namespace std;

int main(void)
{
	ios_base::sync_with_stdio(false); cin.tie(NULL);
	int N, i, a, b, c, cnt[4][4] = { 0 };

	cin >> N;
	for (i = 1; i <= N; i++)
	{
		cin >> a >> b >> c;
		cnt[1][a]++;
		cnt[2][b]++;
		cnt[3][c]++;
	}

	int mx = 0, p = -1;
	a = 0, b = 0, c = 0;
	for (i = 1; i <= 3; i++)
	{
		if (mx < cnt[i][1] + cnt[i][2] * 2 + cnt[i][3] * 3)
		{
			p = i;
			mx = cnt[i][1] + cnt[i][2] * 2 + cnt[i][3] * 3;
			a = cnt[i][1];
			b = cnt[i][2];
			c = cnt[i][3];
		}
		else if (mx == cnt[i][1] + cnt[i][2] * 2 + cnt[i][3] * 3)
		{
			if (cnt[i][3] > c || (cnt[i][3] == c && cnt[i][2] > b))
			{
				p = i;
				mx = cnt[i][1] + cnt[i][2] * 2 + cnt[i][3] * 3;
				a = cnt[i][1];
				b = cnt[i][2];
				c = cnt[i][3];
			}
			else if (cnt[i][3] == c && cnt[i][2] == b) p = 0;
		}
	}

	cout << p << ' ' << mx;
}


감사합니다.

0개의 댓글