🕒 2020/05/02
🔄 2024/10/14
第二回 アルゴリズム実技検定 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;
}