第二回 アルゴリズム実技検定 B – 多数決 解説

問題

問題文は本家サイトにあります:第二回 アルゴリズム実技検定 B – 多数決

問題概要

投票結果 $S$ が与えられるので、候補者 a, b, c の中で一番得票数が多かった人を答えなさい。なお、 $S$ の $i$ 番目の文字が、どの候補者に投票したかを表しているものとします。

制約

$S$ の文字数は $1$ 以上 $1000$ 以下。
$S$ の各文字は、 a, b, c のどれか。
一番得票数が多かったのはちょうど一人。

解説

各文字に応じてそれぞれの得票数を数え、最後に一番多いものを返せばいいです。C++ では、次のように書けます。

#include <iostream>
#include <vector>
using namespace std;

int main() {
  string S; cin >> S;
  int a = 0, b = 0, c = 0;
  for (int i = 0; i < S.size(); i++) {
    if (S[i] == 'a') a++;
    if (S[i] == 'b') b++;
    if (S[i] == 'c') c++;
  }
  
  string ans = "a";
  if (b > a && b > c) ans = "b";
  if (c > a && c > b) ans = "c";
  cout << ans;
  return 0;
}

配列を使ったり、char 型の引き算を使ったり、最大要素を指すイテレータを取得する max_element を使えば、次のように書くこともできます。

【広告】
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
  string S; cin >> S;
  vector<int> cnt(3, 0);
  for (int i = 0; i < S.size(); i++) {
    cnt[S[i] - 'a']++;
  }
  
  int maxIndex = max_element(cnt.begin(), cnt.end()) - cnt.begin();
  cout << (char) ('a' + maxIndex);
  return 0;
}