paizaオンラインハッカソン7に参加してみた – ロングヘアー(C++, Swift)

注意: この記事は1年以上前に掲載されたものです。情報が古い場合がありますのでお気を付け下さい。

paizaオンラインハッカソン7に参加してみた – ショートヘア(C++, Swift)に続いて、今回はロングヘアーで出されたお題について、回答例をあげてみたい。今回もC++及びSwiftでサンプルコード及び解説を行いたい。

今回のお題の目的について

今回は5回にわたって”yes”または”no”が入力されるので、どちらか多い方を出力するというものである。

したがって、以下ができているかが必要条件あるいは十分条件となる。

  • 連想配列、またはキーを定義付けた配列を使える
  • 条件分岐を使える
  • forループを使える

サンプルコード

C++

参考URL: https://github.com/saitomarch/POH7/blob/master/cpp/long_hair.cpp

[code lang=”cpp”]#include <iostream>
#include <string>
#include <map>
#include <cstdlib>
using namespace std;
int main(void){
const auto times = 5;
map<string, int> answer_map;
for (int cnt = 0; cnt < times; cnt++) {
string str;
getline(cin, str);
answer_map[str] += 1;
}
string answer;
int num = 0;
for (auto pair : answer_map) {
if (pair.second > num) {
answer = pair.first;
num = pair.second;
}
}
cout << answer << endl;
return EXIT_SUCCESS;
}[/code]

Swift

参考URL: https://github.com/saitomarch/POH7/blob/master/swift/long_hair.swift

[code lang=”swift”]var ans : Dictionary<String, Int> = Dictionary<String, Int>()
let times = 5;
for (var cnt = 0; cnt < times; cnt++) {
let key = readLine()!
if (ans[key] == nil) {
ans[key] = 0
}
ans[key]! += 1;
}
var maxKey :String?
var max = 0;
for (key, val) in ans {
if (val > max) {
max = val;
maxKey = key;
}
}
if (maxKey != nil) {
print(maxKey!)
}[/code]

解説

今回はC++、Swift共に連想配列 ((C++ではstd::map、SwiftではDictionary)) を使った。これは入力される文字列がyesまたはnoに固定されているからである。

まずは、入力した文字列をキーとして、連想配列の値に加算するという処理を行う。これによって、yesとnoのカウント数を取ることができる。

その後、それの回答を集計した連想配列をベースにforループで回して、最大値とそのキーを取得し、最大値のキーを出力するという方法をとっている。

最後に

これも連想配列が使えればかなり簡単にできるだろう。前2題と比較すると言語によって多少難易度が上がっているが、これも難なくこなしたいところである。

タイトルとURLをコピーしました