図解解説シリーズ
競技プログラミングを始めたばかりでAtCoderの解説やJOIの解説ではいまいちピンと来ない…という人向けに、図解を用いて解説を行います。
問題文
情報オリンピック日本委員会に掲載されている問題
AtCoderに掲載されている問題
入出力など実際に確認して自分の作成したプログラムを採点することができます。
図解解説
今年度の一次予選のB問題は、以下の3つのスキルを確認する問題になっています。
1.入力・出力を正しく利用できる
2.算術演算子を正しく利用できる
3.条件分岐(if)を正しく利用できる
問題文を整理するために、具体的な数字を用いて、図示して考えてみます。
入力例1のA=9時を使って、B時間後に何時になるか表を作成してみます。すると、1~12の数字が周期的に出てくることを確認することができます。
そこで、表の中にA+Bの計算結果を入れてみます。12時間ごとに変わるので、A+Bを12で割った余りを書き加えてみます。すると、余りが0のとき時刻は一致しませんが、それ以外の時刻は一致することが確認できます。そこで、A+Bを12で割った余りが0のときは答えが12、それ以外のときは答えがA+Bを12で割った余りを表示するようにプログラムを作成します。
場合分けをせずに答えを出す方法を考えてみます。1時~12時の周期が、12で割った余りの0~11の周期と一致するように計算を調整します。そのためにA+B-1を計算し、この値(A+B-1)を12で割った余りを求めると周期が一致します。余りに1を加えると1~12となり、1時~12時の値と一致します。
解答例
余りが0のときとそれ以外のときで場合分けをしたプログラム
A = int(input())
B = int(input())
#A時のB時間後が何時になるか計算を行う
#A+Bを計算し12で割った余りが0のときは、12時
#A+Bを計算し12で割った余りが0でないときは、余り
if (A+B)%12==0:
print(12)
else:
print((A+B)%12)
余りを調整して、if文を使用せずに作成したプログラム
A = int(input())
B = int(input())
#A時のB時間後が何時になるか計算を行う
#A+B-1を計算し12で割った余りに1を加えたのが答え
print((A+B-1)%12+1)
イラスト
スライド内で使用しているイラストはすべて「いらすとや」の素材を利用しています。