LoginSignup
1
0

More than 3 years have passed since last update.

【At Corder】【初心者】ABC087B - Coins をRuby で解いてみた

Posted at

はじめに

AtCoder に登録したら次にやること ~ これだけ解けば十分闘える!過去問精選 10 問 ~ - Qiita

こちらの記事を参考に初心者がAt corderに挑戦します。
目的としては、就職活動でのコーディングテスト対策です。
毎日1問を目標としてコツコツやってきます:thinking:

わからないことは調べる精神です。ちょっとでもわからないなぁ、と思ったことは調べて解説と参考文献を載せますので、同じ内容でわからない人がいれば参考にししてください:baby:

問題 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円玉から評価するようにしました。そうすることで、マイナスになる処理の回数を減らせるかと思いました。
変数が多くなってしまった気がするのですが、配列を使うなどして変数を減らしたほうが良いコードでしょうか?(良いコードという表現があっているのか謎ですが、、:thinking:)

感想

今回はメソッドの仕様以外はなにも参照せずにコードを書くことが出来ました。
目的は達成できましたが、まだまだブサイクな所が多いように感じます。笑
もっとコード数を減らせる方法がないか模索していきたいですね。。:raised_hands:

1
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
1
0