paizaオンラインハッカソン7に参加してみた – 猫耳(C++, Swift)

注意: この記事は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ではインデックスの取り方がかなり面倒だった。

最後に

今回もプログラミング言語のうち、文字列の扱いがわかればそれなりに簡単に解けるだろう。当方のサンプルコードも参考にして、ぜひともチャレンジしてもらいたい。

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