はじめに
Webエンジニアを目指して、RubyやRailsをいじってます。
今回は、RubyでAtCoder ABC309のA, B, Cを解きました。備忘録として解き方をまとめていきたいと思います。
A - Nine
a-309.rb
a, b = gets.split.map(&:to_i)
puts b - a == 1 && a % 3 != 0 ? "Yes" : "No"
B - Rotate
b-309.rb
n = gets.to_i
array = Array.new(n){ gets.chomp }
ans = array.map(&:dup)
1.upto(n - 1) do |i|
ans[0][i] = array[0][i - 1]
ans[i][n - 1] = array[i - 1][n - 1]
end
0.upto(n - 2) do |i|
ans[i][0] = array[i + 1][0]
ans[n - 1][i] = array[n - 1][i + 1]
end
ans.each{ puts _1 }
解説
(他の方の提出結果を参考にしました)
dup
メソッドを使ってオブジェクトの内容をクローンする必要があるみたいです(元のarray
も変わってしまうため)。
C - Medicine
c-309.rb
n, k = gets.split.map(&:to_i)
hash = Hash.new(0)
sum = 0
n.times do
a, b = gets.split.map(&:to_i)
hash[a + 1] += b
sum += b
end
if sum <= k
puts 1
exit
end
hash.sort.each do |key, val|
sum -= val
if sum <= k
puts key
exit
end
end
解説
連想配列hash
に薬の情報を保持させておき、sum
として錠剤の数の総和をもたせておきます。そして、key
(日数)でソートしたhash
についてsum
からval
(錠剤の数)を引き、sum
がk
以下であれば対応するkey(日数)を出力してループを抜けることで解くことができます。なお、1日目スタートであるためkey
の値は元の値よりも1多い値としています。