by CodeJin19
2 min read

Categories

Tags

오늘의 문제는 “10040번 투표”.

n개의 경기와 m명의 심사위원이 있다.

심사위원은 각자의 기준에 적합한 경기 하나를 선정, 투표한다.

표를 가장 많이 받은 경기를 찾아야한다.

#include <iostream>

using namespace std;

int main()
{
	int n, m, idx, mdx;
  int max = 0;
	int nrr[1010];  // 경기의 비용
	int mrr[1010];  // 심사위원의 비용 기준
	int crr[1010];  // 경기의 표수

	cin >> n >> m;  //n개의 경기, m명의 심사위원

	for (int i = 1; i <= n; i++)  //n개의 경기 비용 입력받기와 각 경기의 표수 0으로 초기화
	{
		cin >> nrr[i];
		crr[i] = 0;
	}

	for (int i = 1; i <= m; i++)  //m명의 심사위원 기준 입력받기
	{
		cin >> mrr[i];
	}

	for (int i = 1; i <= n; i++)  //m명의 심사위원에 대해 각 심사위원이 어느 경기에 투표를 할 지 찾기
	{
		idx = 1;

		while (mrr[idx] < nrr[idx] && idx <= n)
		{
			idx++;
		}

		crr[idx]++;  //i번째 심사위원이 idx번째 경기에 투표하므로 crr[idx] 1 증가

		if (max < crr[idx])  //표가 가장 많이 받은 경기 추적
		{
			max = crr[idx];
			mdx = idx;
		}
	}

	cout << mdx << endl;

	return 0;
}

결론부터 말하자면 이 코드에는 두 가지 잘못된 점이 있다.

우선 m명의 심사위원에 대한 반복문인데 for문의 조건식이 i <= n이다.

n은 경기 수이고, m이 심사위원 수이다.

두 번째로 틀린 점은 while문의 조건식이다.

nrr[idx] <= mrr[i]인 idx 중 최소의 idx를 찾아야 하는데,

while(nrr[idx] < mrr[i] && idx <= n)이면 (본 의도는 이거였지만 심지어 본 코드에는 mrr과 nrr이 뒤집혀있고, i도 idx로 잘못썼다)

우선 최소인 idx가 아닌 idx + 1을 찾을뿐더러

그보다 더 전에

1번 경기 비용이 5이고, (nrr[1] = 5)

1번 심사위원의 기준 비용이 3이라면, (mrr[1] = 3)

while문이 돌지도 않아서 idx = 1이 된다.

반복문 부분을 수정한 답안은 다음과 같다.

#include <iostream>

using namespace std;

int main()
{
	int n, m, idx, max, mdx;
	int nrr[1010];  // 경기의 비용
	int mrr[1010];  // 심사위원의 비용 기준
	int crr[1010];  // 경기의 표수

	cin >> n >> m;  //n개의 경기, m명의 심사위원

	for (int i = 1; i <= n; i++)  //n개의 경기 비용 입력받기와 각 경기의 표수 0으로 초기화
	{
		cin >> nrr[i];
		crr[i] = 0;
	}

	for (int i = 1; i <= m; i++)  //m명의 심사위원 기준 입력받기
	{
		cin >> mrr[i];
	}

	max = 0;

	for (int i = 1; i <= m; i++)  //m명의 심사위원에 대해 각 심사위원이 어느 경기에 투표를 할 지 찾기
	{
		idx = 1;

		while (idx <= n)
		{
			if (nrr[idx] <= mrr[i])
			{
				break;
			}

			idx++;
		}

		crr[idx] += 1;  //i번째 심사위원이 idx번째 경기에 투표하므로 crr[idx] 1 증가

		if (max < crr[idx])  //표가 가장 많이 받은 경기 추적
		{
			max = crr[idx];
			mdx = idx;
		}
	}

	cout << mdx << endl;

	return 0;
}

변수명의 지나친 단순화로 변수를 잘못 적는 실수를 이번에도 반복했다.

n, max, mdx 등은 어느정도 고정된 의미를 갖는 변수로 사용하지만,

문제에 따라 다르게 사용하는 경우 좀 더 경각심을 가지고 코딩을 하면 좋겠다.

또한, while문의 조건문 역시 조심히 다뤄야 할 것 같다.