0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【図解解説】JOI2021-2022 一次予選 第2回 問題2 短針

Posted at

図解解説シリーズ

競技プログラミングを始めたばかりでAtCoderの解説やJOIの解説ではいまいちピンと来ない…という人向けに、図解を用いて解説を行います。

問題文

情報オリンピック日本委員会に掲載されている問題

AtCoderに掲載されている問題

入出力など実際に確認して自分の作成したプログラムを採点することができます。

図解解説

今年度の一次予選のB問題は、以下の3つのスキルを確認する問題になっています。
1.入力・出力を正しく利用できる
2.算術演算子を正しく利用できる
3.条件分岐(if)を正しく利用できる

問題文を整理するために、具体的な数字を用いて、図示して考えてみます。
スライド1.PNG
入力例1のA=9時を使って、B時間後に何時になるか表を作成してみます。すると、1~12の数字が周期的に出てくることを確認することができます。

そこで、表の中にA+Bの計算結果を入れてみます。12時間ごとに変わるので、A+Bを12で割った余りを書き加えてみます。すると、余りが0のとき時刻は一致しませんが、それ以外の時刻は一致することが確認できます。そこで、A+Bを12で割った余りが0のときは答えが12、それ以外のときは答えがA+Bを12で割った余りを表示するようにプログラムを作成します。

スライド2.PNG
場合分けをせずに答えを出す方法を考えてみます。1時~12時の周期が、12で割った余りの0~11の周期と一致するように計算を調整します。そのためにA+B-1を計算し、この値(A+B-1)を12で割った余りを求めると周期が一致します。余りに1を加えると1~12となり、1時~12時の値と一致します。

解答例

余りが0のときとそれ以外のときで場合分けをしたプログラム

b1.py
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文を使用せずに作成したプログラム

b2.py
A = int(input())
B = int(input())
#A時のB時間後が何時になるか計算を行う
#A+B-1を計算し12で割った余りに1を加えたのが答え
print((A+B-1)%12+1)

採点サイトに提出したプログラム

イラスト

スライド内で使用しているイラストはすべて「いらすとや」の素材を利用しています。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?