[AtCoder]ABC088B – Card Game for Two[Ruby]

プログラミング

問題

N枚のカードがあります. i枚目のカードには, aiという数が書かれています.
Alice と Bob は, これらのカードを使ってゲームを行います. ゲームでは, Alice と Bob が交互に 1 枚ずつカードを取っていきます. Alice が先にカードを取ります.
2 人がすべてのカードを取ったときゲームは終了し, 取ったカードの数の合計がその人の得点になります. 2 人とも自分の得点を最大化するように最適な戦略を取った時, Alice は Bob より何点多く取るか求めてください.


入出力例

入力例
2
3 1
出力例
2
最初,Aliceは3が書かれたカードを取ります. 
次に,Bobは1が書かれたカードを取ります. 
得点差は3-1=2となります.

自分の回答

def CardgameforTwo(numbers)
  alice_point = 0
  count = 0
  numbers = numbers.sort.reverse
  numbers.each do |number|
    if count % 2 == 0
      alice_point += number
      count += 1
    else
      alice_point -= number
      count += 1
    end
  end
  p alice_point
end

amount = gets.chomp.to_i
numbers = gets.chomp.split(" ").map(&:to_i)
CardgameforTwo(numbers)

入力されたカードの番号をnumbersに入れて、.sort.reverseで番号の高い順に並べます。

そして、奇数番目のものはAliceの得点(alice_point)となるので、pointに加算していきます。偶数番目の番号はBobの得点となるので、Aliceの得点から減算していけば、答えは求まります。

今までのB問題に比べて、簡単に感じました。また、前回学んだ、自己代入演算子が早速役に立ちました。

もっとよくする

def CardgameforTwo(numbers)
  point = 0
  count = 0
  numbers = numbers.sort.reverse
  numbers.each do |number|
    count % 2 == 0 ? point += number : point -= number
    count += 1  
  end
  p point
end

amount = gets.chomp.to_i
numbers = gets.chomp.split(" ").map(&:to_i)
CardgameforTwo(numbers)

if文をワンライナーで書くことで、コードの記述を短くしました。最初からワンライナーでかけないかなと思っていたのですが、count += 1を三項演算子の中に入れる方法がわからなかったので、諦めました。後になって、count += 1だけ三項演算子だけ外に出せばいいのだと思いつきました。

タイトルとURLをコピーしました