== ì†Œê° == 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; } }}} == 댓글 == ---- [AustralianVoting]