#はじめに
AtCoder に登録したら次にやること ~ これだけ解けば十分闘える!過去問精選 10 問 ~ - Qiita
こちらの記事を参考に初心者がAt corderに挑戦します。
目的としては、就職活動でのコーディングテスト対策です。
毎日1問を目標としてコツコツやってきます
わからないことは調べる精神です。ちょっとでもわからないなぁ、と思ったことは調べて解説と参考文献を載せますので、同じ内容でわからない人がいれば参考にししてください
#問題 ABC087B - Coins
500円玉をA枚、100円玉をB枚、50円玉をC枚ある。これらの中から何枚か選び、合計金額をちょうどX円にする方法は何通りあるか?
同じ種類の硬貨同士は区別できない。2通りの硬貨の選び方は、ある種類の硬貨についてその効果を選ぶ枚数が異なるときに区別される。
#制約
- 0≤A,B,C≤50
- A+B+C≥1A+B+C≥1
- 50≤X≤20,000
- A,B,C は整数である
- Xは50の倍数である
#入力 出力
###入力
A
B
C
X
###出力
硬貨を選ぶ方法の個数を出力せよ
###入力例
2
2
2
100
###出力例
2
- 500 円玉を 0 枚、 100 円玉を 1 枚、 50 円玉を 0 枚選ぶ。
- 500 円玉を 0 枚、 100 円玉を 0 枚、 50 円玉を 2 枚選ぶ。
#回答
a = gets.to_i
b = gets.to_i
c = gets.to_i
x = gets.to_i
count = 0
#入力
for i in 0..a #500円玉の枚数
x_1 = x - 500*i
break if x_1 < 0 #マイナスだとループを抜ける
for j in 0..b #100円玉の枚数
x_2 = x_1 - 100*j
break if x_2 < 0
for k in 0..c #50円玉の枚数
x_3 = x_2 - 50*k
count += 1 if x_3 == 0
break if x_3 <= 0
end
end
end
puts count
#解説
500円玉から評価するようにしました。そうすることで、マイナスになる処理の回数を減らせるかと思いました。
変数が多くなってしまった気がするのですが、配列を使うなどして変数を減らしたほうが__良いコード__でしょうか?(良いコードという表現があっているのか謎ですが、、)
#感想
今回はメソッドの仕様以外はなにも参照せずにコードを書くことが出来ました。
目的は達成できましたが、まだまだブサイクな所が多いように感じます。笑
もっとコード数を減らせる方法がないか模索していきたいですね。。