ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Cs50 Week3: Problem Set, Plurality
    Programming/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

    1. vote 함수는 투표 이름을 입력받고, 해당 이름이 선거 등록을 했으면 표를 가산, 없으면 false 값을 리턴한다. 무효표도 투표권을 행사한 것으로 치며, 동명이인은 고려하지 않는다.
    2. 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번이나 도는 게 비효율적이지 않나 라는 생각을 했는데, 최대 후보자 수가 작기도 하고, 좋은 아이디어가 생각나지 않아 그대로 두었다.

    댓글