-
Cs50 Week3: Problem Set, PluralityProgramming/CS50 2023. 7. 7. 16:01
하버드 CS50 3주차 Problem Set 과제 Plurality 의 풀이 과정을 다룹니다.
C언어로 배열을 탐색하며 최다 득표자를 출력하는 문제입니다.Intro
복수투표 선거를 구현하는 문제
$ ./plurality Alice Bob Charlie Number of voters: 4 Vote: Alice Vote: Bob Vote: Charlie Vote: Alice Alice
Template
기초 코드 템플릿이 주어져 있다.
vote()
함수와print_winner()
함수만 구현하면 된다.#include <cs50.h> #include <stdio.h> #include <string.h> // Max number of candidates #define MAX 9 // Candidates have name and vote count typedef struct { string name; int votes; } candidate; // Array of candidates candidate candidates[MAX]; // Number of candidates int candidate_count; // Function prototypes bool vote(string name); void print_winner(void); int main(int argc, string argv[]) { // Check for invalid usage if (argc < 2) { printf("Usage: plurality [candidate ...]\n"); return 1; } // Populate array of candidates candidate_count = argc - 1; if (candidate_count > MAX) { printf("Maximum number of candidates is %i\n", MAX); return 2; } for (int i = 0; i < candidate_count; i++) { candidates[i].name = argv[i + 1]; candidates[i].votes = 0; } int voter_count = get_int("Number of voters: "); // Loop over all voters for (int i = 0; i < voter_count; i++) { string name = get_string("Vote: "); // Check for invalid vote if (!vote(name)) { printf("Invalid vote.\n"); } } // Display winner of election print_winner(); } // Update vote totals given a new vote bool vote(string name) { // TODO return false; } // Print the winner (or winners) of the election void print_winner(void) { // TODO return; }
Detail
vote
함수는 투표 이름을 입력받고, 해당 이름이 선거 등록을 했으면 표를 가산, 없으면 false 값을 리턴한다. 무효표도 투표권을 행사한 것으로 치며, 동명이인은 고려하지 않는다.print_winner
함수는 최다득표자를 출력한다. 최다 득표자가 여러명일 경우 여러 줄에 모두 출력한다.
Code
vote 함수
strcmp
를 사용한다.bool vote(string name) { for (int i = 0; i < candidate_count; i++) { if (strcmp(candidates[i].name, name) == 0) { candidates[i].votes++; return true; } } return false; }
print_winner 함수
void print_winner(void) { int max_vote_count = 0; for (int i = 0; i < candidate_count; i++) { if (candidates[i].votes > max_vote_count) { max_vote_count = candidates[i].votes; } } for (int i = 0; i < candidate_count; i++) { if (candidates[i].votes == max_vote_count) { printf("%s\n", candidates[i].name); } } return; }
같은 배열을 2번이나 도는 게 비효율적이지 않나 라는 생각을 했는데, 최대 후보자 수가 작기도 하고, 좋은 아이디어가 생각나지 않아 그대로 두었다.