##はじめに
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