見出し画像

AtCoder Beginner Contest 173を見直すA - Payment

全体の感想

A問題、B問題でいつもより時間がかかった、更にC問題はハマってしまいちょっと間に合わなかった。時間切れ10分後ぐらいに解答できたんだけどね。そんなこんなで、Cは複雑な解答になったので解説をみていい感じの解法を確認しておきたい。そういえば、先週の反省で総当たりの問題をやっておこうと思ったのにできていない。そして今回のCは総当たり系の問題。。。残念

問題

お店でN円の商品を買います。1000円札のみを使って支払いを行う時、お釣りはいくらになりますか?ただし、必要最小限の枚数の 1000円札で支払いを行うものとします。

最初に間違った解答

N = int(input())
print(1000-N%1000)

A問題だから簡単だぜ。と、とりあえず上記のように作ってみた。「N%1000」でNの1000円未満の値が出る。11100%1000=100のような感じで。なので、1000からその値を引けば、求めたい値が出る寸法。

しかし

サンプルを入力してみたら「N」が1000で割り切れる場合(N=3000等)に、出て欲しい値が「0」にも関わらず、「1000」が出てしまった。そこで、「N」が1000で割り切れる場合は、「0」を返す分岐を書いてみた。通りはしたもののなんか納得いかない。

N = int(input())
if N%1000 == 0:
   print(0)
else:
   print(1000-N%1000)

解説に従い作成した解答

解説見てみると以下でイケる。そりゃそうだ。最初の解答を更に1000で割った余りにすれば「1000」は「0」になるし、「1000」未満に変更はない。

N = int(input())
print((1000-N%1000)%1000)

C++でも解答してみた

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

int main() {
   int N;
   cin >> N;
   cout << (1000 - N%1000) % 1000 << endl;
}

A問題だとPythonとC++でもそんなに差はないですね。ちなみに実行時間は以下の通り
Python:29ms
C++:7ms

この記事が気に入ったらサポートをしてみませんか?