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題と比較すると言語によって多少難易度が上がっているが、これも難なくこなしたいところである。
ウェブマスター。本ブログでITを中心にいろいろな情報や意見などを提供しています。主にスマートフォン向けアプリやウェブアプリの開発を携わっています。ご用の方はコメントかコンタクトフォームにて。