ITP1_9_A 単語の検索をC++で解いてみた[AIZU ONLINE JUDGE]

AIZU ONLINE JUDGE

こんにちは! mnbd(@mnbbbbbd)です。

AIZU ONLINE JUDGEの「ITP1_9_A 単語の検索」を解いてみましたので、その回答と解説をご紹介いたします。

プログラミング初心者なので、もっといい回答があるに違いありません。

あくまでも「動作はする」サンプルとしてご覧ください。

問題文

1つの単語 W と文章 T が与えられます。T の中にある W の数を出力するプログラムを作成して下さい。

文章 T に含まれるスペースまたは改行で区切られた文字列を単語 Ti とします。すべての Ti において単語 W と同じになるものを数えて下さい。

なお、大文字と小文字は区別しません。

Constraints

・Wの文字列の長さは10を超えない

・Wに含まれる文字はすべてアルファベット小文字である

・Tの1行あたりの文字列の長さは1000を超えない

Input

1行目に単語 W が与えられます。

続いて、複数の行にまたがった文章与えられます。END_OF_TEXT という文字列が文章の終わりを示します。

Output

単語 W の数を出力して下さい。

https://onlinejudge.u-aizu.ac.jp/courses/lesson/2/ITP1/9/ITP1_9_A

回答

#include <bits/stdc++.h>
using namespace std

int main() {
    string w, t;
    cin >> w;
    int count = 0;

    while(cin >> t) {
        if(t == "END_OF_TEXT") {
            break;
        }
        transform(t.begin(), t.end(), t.begin(), ::tolower);
        if(t == w) {
            count++;
        }

        
    }
    cout << count << endl;

    return 0;
}

解説

ワード用の変数wとテキスト用の変数tをそれぞれstring型、カウント数をint型で確保します。

ループで変数tにテキストの一単語を読み込み、小文字に変換して、変数wと同じか判定して、同じならカウントしてます。

この問題では、入力の終わりを「END_OF_TEXT」で指定されているので、それでループを抜けます。

ハマったポイント

transform関数のところでコンパイルエラーが出てハマりましました。

具体的にはtransform関数の最後の引数です。

実際に上記の書き方ですと、「::tolower」と指定すべきでした。

私はそこで「tolower」と指定したり、「using namespace std;」を消して「std::tolower」と指定したりしましたが、うまくいきませんでした。

いろいろネットで調べていたところ、transform関数では「std::tolower」となっているケースが多かったため、余計にわかりませんでした。

学んだこと

ハマリポイントに重なりますが、transform関数の引数について学びました。

まとめ

AIZU ONLINE JUDGEの「ITP1_8_C リング」を解いてみましたので、その回答と解説をご紹介いたします。

以上です。
読んでいただきありがとうございました!