LoginSignup
0
0

More than 1 year has passed since last update.

[Ruby] AtCoder過去問 B - Card Game for Two

Posted at

はじめに

AtCoderのB問題をRubyで解いて見ました。
いろんな考え方や書き方が自分の中でもたくさんあって、どの書き方を記事にしようか迷いましたが、一番自分がわかりやすいコードを載せることにしました!

よろしくお願いします。

問題は以下から確認してください。

B - Card Game for Two

まずは入力受け取りの記述を書きます。

n = gets.to_i
points = gets.split.map(&:to_i)

続きまして、2行目で受け取った配列の順番を後々、処理がしやすいように降順に並べ替えます。
sort.reverseを使います。この使い方は以前記事にしていますのでそちらも見ていただければと思います。↓

こちら、破壊的メソッドではないのでもう一度pointsに入れ直すような書き方をしておきます。
これで配列の先頭から数字が大きい順に並んでいます。つまりAliceとBob達は最善のカード取っていくので配列の先頭からとっていくことになります。

n = gets.to_i
points = gets.split.map(&:to_i)
points = points.sort.reverse

次にAliceとBobのポイントを用意します。
そのあと、繰り返し処理を行うのでcountも用意しておきます。

n = gets.to_i
points = gets.split.map(&:to_i)

points = points.sort.reverse

alice = 0
bob = 0
count = 0

ここからはtimesメソッドを使ってn回処理を行なっていきます。(n枚のカードしか存在しないので)

n = gets.to_i
points = gets.split.map(&:to_i)

points = points.sort.reverse
alice = 0
bob = 0
count = 0

n.times do
  if count == 0 || count % 2 == 0
    alice += points.shift
  elsif count == 1 || count % 2 == 1
    bob += points.shift
  end
  count += 1
end

このような繰り返し処理をします。
最初のif文のif count == 0 || count % 2 == 0はcountが0または偶数のときに実行させる条件分岐の条件式です。

その中のalice += points.shiftですが、このshiftメソッドがキーとなります。
これは配列の先頭を取り出して、削除してくれます。

つまりここで行なっている処理は、今存在するカードの中から最も大きい数を取り出してAliceのポイントに加算した後、配列pointsからは削除されます。

elsif以下の処理は、Bob版の処理ということになります。Aliceの時と同じです。

最後にAliceからBobのポイントを引いたものを出力すれば完成です。

n = gets.to_i
points = gets.split.map(&:to_i)

points = points.sort.reverse

alice = 0
bob = 0
count = 0

n.times do
  if count == 0 || count % 2 == 0
    alice += points.shift
  elsif count == 1 || count % 2 == 1
    bob += points.shift
  end
  count += 1
end

puts alice - bob
0
0
1

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