エバンスの雑記帳

MBA、Python、子育て、将棋、文房具、その他

Python学習法_Paizaラーニングの練習問題

こんにちは。文系なのにPythonにハマっているエバンスです。
以前の記事でPython学習のための無料サービス「Paizaラーニング」を紹介しました。この記事では、そのサイト内の練習問題について、私が問題に取り組んだ課程を振り返り、解き方を説明したいと思います。

以前の記事はこちら。

evansmode.hatenablog.jp

練習問題

Paizaラーニングにはたくさんの練習問題が掲載されています。練習問題は、時間制限なしで自分の評価(ランク)にも影響がないため、気軽に腕試しをすることができます。

「プログラミング練習問題」という名前で、Paizaラーニングのトップページ上からアクセスすることができます。(他のコースに混ざって、ページの底に近いあたりに掲載されているので、意外と見つけにくいです。。)

こんなのです。
f:id:evansmode:20180514022052p:plain

問題ランク

練習問題は、それぞれSからDまでランク付けされているので、自分の実力に合わせた問題に挑戦することができます。

まずは、時間のかからないDランクかCランクの問題を解いてみると良いと思います。Dランクであれば1分かからずに解けますし、Cランクでも5分程度で解くことができると思います。

私の場合、Bランクが10~20分かけて楽しんで解けるレベルです。Aランクだと真面目に考えないと答えに辿り着けない、また、メモを取らないとコーディングの途中で迷子になる感じです。

問題を解く流れ

まずは問題文を読みましょう。入力例と回答例も載っていて、どのような回答が求められているのか、イメージしやすく親切です。

簡単な問題であれば、この時点でコーディングの内容について目途が付いていると思います。

また、コーディングの前に、解答欄の右上のプルダウンで Python3 を選択するのを忘れないでください。

1. データの取得方法

Paizaラーニングの問題では、「標準入力」という形態でデータが与えられるのですが、これが慣れないうちは意味不明で挫折しがちです。

問題とは関係ないところで引っかかるのは単なる時間の無駄なので、↓の記事を見て、データの取得・加工(切り分け等)は丸写ししてしまうのをオススメします。

qiita.com

なお、出力(回答)は print するだけなので簡単です。

今回の問題では、文字列形式で数字が与えられるので、↓のとおり int() 関数を使って整数形式に変換しながらデータを受け取るようにしました。

input_int = int(input())

2. コーディング(繰り返し処理)

入力の部分が終われば、いよいよ本題です。
私が今回挑戦した問題は「Fizz Buzz」というもので、整数Nが与えられ、整数1~Nを1行ずつ出力する問題です。ただし、出力する数字が3の倍数ならFizz、5の倍数ならBuzz、3と5の倍数(要は15の倍数)ならばFizz Buzzと出力せよ、という指示です。(世界のナベアツ。。。)

1~Nを出力する点に注目して、繰り返し処理について記述します。Pythonでは "For文" を使用します。

For i in range(input_):
    print(i+1)

pythonの繰り返し処理の変数 i は、range() を使うと0から始まるので print(i+1) として 1~N が出力されるようにしています。

なお、初心者の場合、コードを書いたらその部分が正しく動くか、少しずつテストして確認することをオススメします。

提出前動作確認ボタンを押下すると、その時点で書いてあるコードを実行してくれるので、きちんと繰り返し処理ができているか、print() の結果を見ることで確認することができます。

f:id:evansmode:20180514033146p:plain

今回は、提出前動作確認の結果、1~20が出力され、正しく繰り返し処理が実行されることを確認できました。(実行結果ステータスの Wrong Answer はこの段階では無視してください)

3. コーディング(条件分岐)

繰り返し処理に問題がないので、15の倍数→3の倍数→5の倍数→それ以外、という順番で条件を分岐させるコードを書きます。(3と5の倍数の条件分岐は順番が逆でも大丈夫です)

なお、15の倍数は、3と5の倍数でもあるので、二重に出力されないようにそれぞれの条件分岐が入れ子になる(else を使用)ようにしています。

例えば、15であれば Fizz Buzz と出力(print)して、それ以降の処理は行いません。

if (i+1)/15 == round((i+1)/15):
        print("Fizz Buzz")
    else:
        if (i+1)/3 == round((i+1)/3):
            print("Fizz")
        else:
            if (i+1)/5 == round((i+1)/5):
                print("Buzz")
            else:
                print(i+1)

4. 提出前動作確認

コードを書き終えたら、与えられているデータについて上手く処理できるか、最後のテストをしましょう。

f:id:evansmode:20180514033253p:plain

与えられた入力データ "20" に対して、正しく処理できたことが確認できました。実行結果ステータスも Success になっています。

※慎重派の方は、自分でもテストデータを作って(input_int に自分で任意のデータを格納)テストするのも良いと思います。

5. 最終提出

最終提出をすると、他の入力データに基づいて、Paizaラーニング側が評価を実施します。 私のコードは、10個すべてのテストをパスし、正解となりました。

f:id:evansmode:20180514034940p:plain

まとめ

PaizaラーニングのDランク練習問題を解く流れについて解説してみました。

標準入出力には戸惑われると思いますが、慣れるまではコピペで済ませ、問題を解くのに集中することをオススメします。また、プログラミング初心者がコーディングする時は、頻繁に提出前動作確認(print で出力)を実施して、自分の思うような処理ができているか確認すると、どこで間違っているのかわからない、という状況に陥ることなくスムーズに解答できると思います。