paizaオンラインハッカソン7に参加してみた – 猫耳(C++, Swift)に続いて、今回はPOH7の追加問題の「猫」のお題に回答してみたい。
お題の目的
このお題では、”c”、”a”、”t”からなる文字列を解析して、catを作れる個数と、余った文字からcatを揃えるのに何個その文字が必要かをそれぞれ出力するというものである。
このお題では以下の要素が使えるかどうかが重要になる。
- 条件分岐(switchあるいはif〜else)
- 最大値・最小値
サンプルコード
C++
cf: https://github.com/saitomarch/POH7/blob/master/cpp/cat.cpp
#include <iostream>
using namespace std;
string readline() {
string str;
getline(cin, str);
return str;
}
int main(void){
auto c = 0, a = 0, t = 0;
const auto input = readline();
for (auto ch : input) {
switch (ch) {
case 'c':
c++;
break;
case 'a':
a++;
break;
case 't':
t++;
break;
default:
break;
}
}
auto maxNum = max({c, a, t});
auto minNum = min({c, a, t});
cout << minNum << endl;
cout << maxNum - c << endl;
cout << maxNum - a << endl;
cout << maxNum - t << endl;
return 0;
}
Swift
cf: https://github.com/saitomarch/POH7/blob/master/swift/cat.swift
let input = readLine()!
var c = 0, a = 0, t = 0
input.characters.forEach { (ch) in
switch (ch) {
case "c":
c += 1
break
case "a":
a += 1
break
case "t":
t += 1
break
default:
break
}
}
let maxNum = max(c, a, t)
let minNum = min(c, a, t)
print(minNum)
print(maxNum - c)
print(maxNum - a)
print(maxNum - t)
解説
まず、入力より文字列を取得する。
その後、C++では範囲ベースのforループ、SwiftではforEachメソッドで一文字ずつ文字を解析して、c,a,tにそれぞれ振り分けて加算する。なお、この際にC++ではchar型の変数になるのに対し、Swiftでは分割された文字列として扱われるため要注意である。
それを元に、c,a,tの最大値(余った数を取得するのに使う)と最小値(入力された文字列でcatが作れる数)を取得する。今回はC++ではstd::initializer_listの配列として、Swiftでは可変長の引数としてそれぞれmax関数及びmin関数を使っている。
その後、まずは入力された文字列でcatが作れる数を出力、追って、c,a,tの順に余った数(c,a,tの最大値からそれに該当する数を差し引いたもの)を出力する。
今回は言語仕様をある程度理解していれば容易に答えることができるだろう。
最後に
今回のお題はその言語で文字列からある文字を取得した時、それが文字型になるのか、あるいは文字列型になるのか、あるいは最大値と最小値の取得の仕方さえ気をつければ難なくクリアできるだろう。プログラミング初心者もこの辺りはクリアできるようにはなりたいところである。
ウェブマスター。本ブログでITを中心にいろいろな情報や意見などを提供しています。主にスマートフォン向けアプリやウェブアプリの開発を携わっています。ご用の方はコメントかコンタクトフォームにて。