CS50 Probelm set 3 - 다수결 투표

dondonee·2023년 2월 4일
0

CS50

목록 보기
8/12
post-thumbnail

다수결 투표

다양한 투표 시스템이 존재하지만, 아마도 다수결 투표가 가장 단순한 투표 방식일 것이다. 다수결 투표에서는 투표자가 한 명의 후보을 뽑을 수 있고, 투표가 완료되면 가장 많은 표를 얻은 후보자가 당선된다.


Plurality 과제

다음과 같이 명령행 인자로 투표 입후보자의 이름을 받고, 프롬프트로 투표자 수를 입력받은 후, 다수결 투표를 시뮬레이션하는 프로그램을 만든다.

$ ./plurality Alice Bob Charlie
Number of voters: 4
Vote: Alice
Vote: Bob
Vote: Charlie
Vote: Alice
Alice
$ ./plurality Alice Bob Charlie
Number of voters: 5
Vote: Alice
Vote: Charlie
Vote: Bob
Vote: Bob
Vote: Alice
Alice
Bob

과제용 뼈대 코드

  • #define MAX 9MAX가 상수 9임을 의미하며, 이것은 프로그램 전체에서 사용될 수 있다. 이 프로그램에서는 투표에 참여할 수 있는 최대 인원수를 의미한다.
  • 파일에는 candidate라는 struct가 정의되어 있다. 각 candidate은 두 개의 필드를 가진다. 하나는 후보자의 이름을 저장하는 string이고, 다른 하나는 후보자의 득표 수를 저장하는 int이다. 그 다음, 파일에는 candidates 라는 전역 배열 변수가 정의되어 있는데, 각 원소가 하나의 candidate이 된다.
  • main 함수를 보면, 프로그램은 투표 입후보자의 수를 나타내는 전역변수 candidate_count을 선언하고, candidates 배열에 명령행 인자를 복사하며, 사용자에게 투표자 수를 입력받는 프롬프트를 출력한다. 그 다음에는 vote 함수를 출력하여 모든 투표자가 투표를 하도록 한다. 마지막으로는 print_winner를 호출하여 투표의 당선자를 출력한다.
  • 빈 칸으로 남아있는 voteprint_winner 함수를 보충하여 프로그램을 완성한다.

지시사항

  • vote 함수를 완성한다.
    • vote는 하나의 인수로 string 타입의 name을 받는다. 투표 입후보자의 이름을 의미한다.
    • 만약 name이 입후보자의 이름 중 하나와 일치한다면, 해당 후보자의 총 득표수를 업데이트한다. 이 경우 함수는 유효한 투표를 의미하는 true를 반환한다.
    • 만약 name이 어떤 입후보자와의 이름과도 일치하지 않는다면, 총 투표수는 변하지 않는다. 이 경우 함수는 유효하지 않은 투표를 의미하는 false를 반환한다.
    • 입후보자의 이름은 중복되어서는 안된다.
  • print_winner 함수를 완성한다.
    • 가장 많은 득표를 한 후보자의 이름을 출력한 뒤, 그 다음 새 행을 출력한다.
    • 복수의 후보자가 최다 득표를 가지게 될 수도 있다. 이 경우 각 후보의 이름을 분리된 행으로 출력한다.
  • voteprint_winner 함수 외의 부분은 수정해서는 안된다(헤더 파일 추가는 가능하다).


✍️ 풀이

vote()

bool vote(string name)
{
    for (int i = 0; i < candidate_count; i++)
    {
        if (strcmp(name, candidates[i].name) == 0)
        {
            candidates[i].votes++;
            return true;
        }
    }

    return false;
}
  • 사용자가 투표시 입력한 name을 인수로 받고, for 루프를 돌아 name과 일치하는 candidates.name을 찾으면 해당 candidates.votes를 1 증가
  • C언어에서는 비교 연산자로 문자열을 직접 비교할 수 없으므로 strcmp()를 이용.

void print_winner(void)
{
    int max = 0;

    for (int i = 0; i < candidate_count; i++)
    {
        if (candidates[i].votes > max)
        {
            max = candidates[i].votes;
        }
    }

    for (int i = 0; i < candidate_count; i++)
    {
        if (candidates[i].votes == max)
        {
            printf("%s", candidates[i].name);
            printf("\n");
        }
    }

    return;
}
  1. 최대 득표수를 저장하는 int 타입 변수 max를 0으로 초기화
  2. for 루프로 후보자의 득표수 중 최대값을 찾아 max에 저장
  3. for 루프로 최다 득표수 max와 일치하는 후보자를 찾아 이름 출력



Reference

0개의 댓글