오늘의 문제는 “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문의 조건문 역시 조심히 다뤄야 할 것 같다.