บทนำ
ในบทช่วยสอนนี้ เราจะเขียนโปรแกรมหา ผู้ชนะการเลือกตั้ง จากอาร์เรย์ชื่อผู้สมัครที่ได้รับโหวต หากโหวตเท่ากัน ให้เลือกผู้มีชื่อเรียงลำดับอักษรก่อน (Lexicographically smaller)
ตัวอย่าง
Input: {"A", "B", "C", "B", "A", "C", "D", "D", "A", "B", "D", "B", "A"}
Output: "A"
(A และ B ได้ 4 โหวตเท่ากัน แต่ A อยู่ก่อน B ในลำดับอักษร)
ขั้นตอนการแก้ปัญหา
- กำหนดอาร์เรย์ชื่อผู้ได้โหวต
- ใช้ map<string, int> นับโหวตแต่ละคน
- วนลูปนับโหวตทั้งหมด
- วนลูปผ่าน map หาคนที่โหวตมากที่สุด
- ถ้าโหวตเท่ากัน ให้เปรียบเทียบชื่อ (string comparison)
ตัวอย่างโค้ด
#include <bits/stdc++.h>
using namespace std;
void findElectionWinner(string votes[], int total_votes) {
map<string, int> candidate_votes_count;
// นับโหวตแต่ละคน
for (int i = 0; i < total_votes; i++) {
candidate_votes_count[votes[i]]++;
}
// หาผู้ชนะ
int max_votes = 0;
string election_winner;
for (auto& entry : candidate_votes_count) {
string key = entry.first;
int val = entry.second;
if (val > max_votes) {
max_votes = val;
election_winner = key;
} else if (val == max_votes && election_winner > key) {
// โหวตเท่ากัน แต่นามสกุล/ชื่ออยู่ก่อน
election_winner = key;
}
}
cout << election_winner << endl;
}
int main() {
string votes[] = {"A", "B", "C", "B", "A", "C", "D", "D", "A", "B", "D", "B", "A"};
findElectionWinner(votes, 13);
return 0;
}
ผลลัพธ์
A
สรุป
ใช้ map นับความถี่และ string comparison แก้ไขการเสมอโหวต โค้ดสั้น กระชับ เข้าใจง่าย หากมีคำถาม สามารถถามได้ในส่วนความคิดเห็นครับ