소ê°� ¶
2005/03/13 Accepted(P.E.) 0:01.191 520
처ì�Œ ì ‘ê·¼ë°©ë²•ì�´ 잘못ë�¼ 하루종ì�¼ ê³ ìƒ�했다.
복잡한 코드는 ê°�ë‹¹í• ìˆ˜ 없는 버그가 ìƒ�긴다
ë¬¸ì œë¥¼ ì œëŒ€ë¡œ ì�´í•´í•´ì•¼í•œë‹¤.
ì½”ë”©í•˜ê¸°ì „ ìƒ�ê°�하는 시간ì�„ ë§Žì�´ 가지ìž�
다른 ë¬¸ì œë“¤ 같았으면 투표ìž�수를 ìž…ë ¥ë°›ì•˜ì�„í…�ë�° ì�´ ë¬¸ì œëŠ” ê·¸ë ‡ì§€ 않다. 그래서 쫌 ì„±ê°€ì‹ ì¸¡ë©´ì�´ 있다.
ë¬¸ì œë¥¼ 풀었ì�„때ì�˜ 기분ì�€ 수많ì�€ 삽질ì�˜ ìŠ¤íŠ¸ë ˆìŠ¤ë¥¼ 한번ì—� ë‚ ë ¤ì¤€ë‹¤.
처ì�Œ ì ‘ê·¼ë°©ë²•ì�´ 잘못ë�¼ 하루종ì�¼ ê³ ìƒ�했다.
복잡한 코드는 ê°�ë‹¹í• ìˆ˜ 없는 버그가 ìƒ�긴다
ë¬¸ì œë¥¼ ì œëŒ€ë¡œ ì�´í•´í•´ì•¼í•œë‹¤.
ì½”ë”©í•˜ê¸°ì „ ìƒ�ê°�하는 시간ì�„ ë§Žì�´ 가지ìž�
다른 ë¬¸ì œë“¤ 같았으면 투표ìž�수를 ìž…ë ¥ë°›ì•˜ì�„í…�ë�° ì�´ ë¬¸ì œëŠ” ê·¸ë ‡ì§€ 않다. 그래서 쫌 ì„±ê°€ì‹ ì¸¡ë©´ì�´ 있다.
ë¬¸ì œë¥¼ 풀었ì�„때ì�˜ 기분ì�€ 수많ì�€ 삽질ì�˜ ìŠ¤íŠ¸ë ˆìŠ¤ë¥¼ 한번ì—� ë‚ ë ¤ì¤€ë‹¤.
소스 ¶
~cpp
#include <iostream>
using namespace std;
#include <stdlib.h>
#include <string.h>
int main()
{
int numberOfCase;
cin >> numberOfCase;
int i, tc;
for (tc = 0; tc < numberOfCase; tc++)
{
int numberOfCandidates;
char candidates[20][81];
int votes[1000][20] = {{0}};
int rank[1000] = {{0}};
int votesPerCandidates[20] = {{0}};
cin >> numberOfCandidates;
cin.get();
for (i = 0; i < numberOfCandidates; i++)
cin.getline(candidates[i], 81);
int numberOfVoters = 0;
char temp[60];
while (cin.getline(temp, 60) && strcmp(temp, ""))
{
votes[numberOfVoters][0] = atoi(strtok(temp, " "));
for (i = 1; i < numberOfCandidates; i++)
votes[numberOfVoters][i] = atoi(strtok(NULL, " "));
numberOfVoters++;
}
bool foundWinner = false;
bool foundTie = true;
int winner;
int sameVote;
int eliminated[20];
int eliminatedCnt = 0;
while (true)
{
for (i = 0; i < numberOfCandidates; i++)
{
votesPerCandidates[i] = 0;
}
// 후보� 개�당 �표수를 구한다
for (i = 0; i < numberOfVoters; i++)
{
votesPerCandidates[votes[i][rank[i]] - 1]++;
}
// 테스트 ì¶œë ¥(후보ìž� ê°œì�¸ë‹¹ ë“�표수)
/*for (i = 0; i < numberOfCandidates; i++)
cout << votesPerCandidates[i] << " ";
cout << endl;*/
// 테스트 ì¶œë ¥(누가 누구 ì„ íƒ�했는지)
/*for (i = 0; i < numberOfVoters; i++)
{
cout << votes[i][rank[i]] << " ";
}
cin.get();*/
// 한명� 50% 초과거나 �표수가 모� 같으면 종료
for (i = 0; i < numberOfCandidates; i++)
{
if (votesPerCandidates[i] > 0.5 * numberOfVoters)
{
foundWinner = true;
winner = i;
break;
}
}
foundTie = true;
sameVote = 0;
for (i = 0; i < numberOfCandidates; i++)
{
if (votesPerCandidates[i] == 0)
continue;
if (sameVote == 0)
sameVote = votesPerCandidates[i];
else if (sameVote != votesPerCandidates[i])
foundTie = false;
}
if (foundWinner || foundTie)
break;
// 가장 ì �ì�€ ë“�표수를 ë°›ì�€ 후보ìž�를 ì°�ì�€ ìœ ê¶Œìž�들ì�€ 후보ìž� ì„ íƒ�ì�„ ê·¸ 후순위ìž�로 ì„ íƒ�(2단계)
int minVote = 1001;
for (i = 0; i < numberOfCandidates; i++)
{
if (votesPerCandidates[i] == 0)
continue;
if (minVote > votesPerCandidates[i])
minVote = votesPerCandidates[i];
}
// 1-ì œê±°ë� 후보ìž� 목ë¡� 만들ê³
for (i = 0; i < numberOfVoters; i++)
{
int j;
if (votesPerCandidates[votes[i][rank[i]] - 1] == minVote)
{
for (j = 0; j < eliminatedCnt; j++)
{
if (eliminated[j] == votes[i][rank[i]])
break;
}
if (j == eliminatedCnt)
eliminated[eliminatedCnt++] = votes[i][rank[i]];
}
}
// 2-ì œê±°ë� 후보ìž� 목ë¡�ì—� 없는 사람중ì—�서 ì„ íƒ�
for (i = 0; i < numberOfVoters; i++)
{
int j;
if (votesPerCandidates[votes[i][rank[i]] - 1] == minVote)
{
bool foundNextCandidates;
while (true)
{
rank[i]++;
foundNextCandidates = true;
for (j = 0; j < eliminatedCnt; j++)
if (votes[i][rank[i]] == eliminated[j])
{
foundNextCandidates = false;
break;
}
if (foundNextCandidates)
break;
}
}
}
// 테스트 ì¶œë ¥(ì œê±°ë�œ 명단)
/*for (i = 0; i < eliminatedCnt; i++)
cout << eliminated[i] << " ";
cout << endl;*/
}
if (foundWinner)
cout << candidates[winner] << endl;
else if (foundTie)
{
for (i = 0; i < numberOfCandidates; i++)
{
if (sameVote == votesPerCandidates[i])
cout << candidates[i] << endl;
}
}
cout << endl;
}
return 0;
}










