CO-S15情報Ⅰ 対策問題

コンピュータとプログラミング思考・計算

次のプログラムを実行したとき、表示される値はどれか。 (1) Kouka = [1, 5, 10, 50, 100] (2) kingaku = 46 (3) maisu = 0 (4) i を 4 から 0 まで 1 ずつ減らしながら繰り返す: (5) | maisu = maisu + (kingaku ÷ Kouka[i]) (6) ⎿ kingaku = kingaku % Kouka[i] (7) 表示する(maisu) ※ ÷は整数の商、%は余りを求める演算とする。配列の添字は0から始まる。

解答・解説を見る

正解: 1

正答

1

この問題のポイント

貪欲法による硬貨枚数計算のトレース(試作問題 第3問と同型)です。÷で枚数、%で残金、を交互に求める流れを追います。

解説

このプログラムは「46円を最少枚数の硬貨で支払う」計算をしています。考え方は「高額の硬貨から使えるだけ使う」——このように、その場その場で最も良い選択を積み重ねる方法を貪欲法と呼びます。iを4から0へ減らしながら回すことで、Kouka[4]=100円から順に高額硬貨から調べている点にまず注目してください。

各回で「kingaku ÷ Kouka[i]」がその硬貨の枚数、「kingaku % Kouka[i]」が支払い後の残金になります。1回ずつトレースします。

  1. i=4(100円): 46÷100=0枚。maisu=0+0=0。残金 46%100=46
  2. i=3(50円): 46÷50=0枚。maisu=0+0=0。残金 46%50=46
  3. i=2(10円): 46÷10=4枚。maisu=0+4=4。残金 46%10=6
  4. i=1(5円): 6÷5=1枚。maisu=4+1=5。残金 6%5=1
  5. i=0(1円): 1÷1=1枚。maisu=5+1=6。残金 1%1=0
  6. 表示: maisu=6

合計6枚で、内訳は「10円玉4枚・5円玉1枚・1円玉1枚」です。÷(整数の商)が「何枚使えるか」、%(余り)が「まだ払えていない金額」に対応する——このペアの意味をつかむことが、この型の問題攻略の核心です。

試作問題そのものの題材で、本番では「枚数()」を関数にして釣り銭を含む最少枚数を考えさせるところまで発展しました。÷と%の意味を問う空欄、ループの向き(高額から)を問う空欄が典型的な出題ポイントです。

選択肢の確認

1.○ 0+0+4+1+1 = 6枚。
2.× 4は10円玉の枚数だけを数えた値。5円玉・1円玉の分が抜けている。
3.× 5はi=1(5円玉)までの途中の枚数で、1円玉の1枚が漏れている。
4.× 46は金額そのもので、枚数ではない。

ここだけは覚えよう

÷で枚数、%で残金、高額硬貨から順に — 貪欲法の硬貨問題は試作問題第3問の定番。

関連問題

CO-S14CO-S16