注意: この記事は1年以上前に掲載されたものです。情報が古い場合がありますのでお気を付け下さい。
paizaオンラインハッカソン7に参加してみた – 縞ニーソ(C++, Swift)からしばらくたって、新たなお題が追加されたということなので、今回は猫耳にチャレンジしてみたい。ソースコードはGitHubにも公開しているので、ぜひとも参照されたい。
今回のお題の目的
今回のお題の目的は、入力された文字列から「cat」を検索して、ヒットした回数を出力するというものである。従って、今回の場合は以下の要素が必要になると言える。
- forループ
- 条件分岐
- 文字列をどうするか
サンプルコード
C++
cf: https://github.com/saitomarch/POH7/blob/master/cpp/nekomimi.cpp
#include <iostream>
using namespace std;
string readline() {
string str;
getline(cin, str);
return str;
}
int main(void){
auto foundCnt = 0;
const string cat = "cat";
const auto input = readline();
for (auto idx = 0; idx <= input.size() - cat.size(); idx++) {
if (input[idx] == cat[0]) {
bool found = true;
for (auto subidx = 1; subidx < cat.size(); subidx++) {
if (input[idx + subidx] != cat[subidx]) {
found = false;
break;
}
}
if (found) {
foundCnt++;
}
}
}
cout << foundCnt << endl;
return 0;
}
Swift
var input = readLine()!
let cat = "cat"
var foundCnt = 0
for idx in 0 ... input.characters.count - cat.characters.count {
var idxInput = input.startIndex.advancedBy(idx)
var idxCat = cat.startIndex;
if (input[idxInput] == cat[idxCat]) {
var found = true
for subIdx in 1 ..< cat.characters.count {
if (input[idxInput.successor()] != cat[idxCat.successor()]) {
found = false
break
}
}
if (found) {
foundCnt += 1
}
}
}
print(foundCnt)
解説
今回の場合は、まず入力された文字を頭からforループで回し、「cat」の先頭比較する。もし先頭が一致した場合は、そこからその部分が「cat」かどうかを判定して、一致していれば見つかったカウントを加算している。
それを最後からcatの文字数分差し引いたところまで確認して、最終的にヒットした数を出力している。
今回は状況によって無駄な処理があるため、最適化しきれていない部分があるが、大体のことはわかるようになるはずだろう。
なお、今回のお題ではC++では概ね簡単だったが、Swiftではインデックスの取り方がかなり面倒だった。
最後に
今回もプログラミング言語のうち、文字列の扱いがわかればそれなりに簡単に解けるだろう。当方のサンプルコードも参考にして、ぜひともチャレンジしてもらいたい。
ウェブマスター。本ブログでITを中心にいろいろな情報や意見などを提供しています。主にスマートフォン向けアプリやウェブアプリの開発を携わっています。ご用の方はコメントかコンタクトフォームにて。