はじめに
Webエンジニアを目指して、RubyやRailsをいじってます。
今回は、RubyでAtCoder ABC274のA, B, Cを解きました。備忘録として解き方をまとめていきたいと思います。
A - Batting Average
a-274.rb
a, b = gets.split.map(&:to_f)
- s = (b / a).round(3).to_s
+ s = b.fdiv(a).round(3).to_s
- puts s + "0" * (5 % s.size)
+ puts sprintf("%0.3f", s)
解説
1.0や0.0だと桁数が足りないので出力するときに調整しています。
B - Line Sensor
b-274.rb
# 修正前
h, w = gets.split.map(&:to_i)
array = Array.new(h){ gets.chomp.chars }.transpose
count = []
array.each do |factor|
count << factor.count("#")
end
puts count.join(" ")
b-274.rb
# 修正後
h, w = gets.split.map(&:to_i)
array = Array.new(h){ gets.chomp.chars }.transpose
puts array.map{ |factor| factor = factor.count("#")}.join(" ")
解説
列で考えるのでtransposeメソッドを使って、行と列を入れ替えています。
C - Ameba
c-274.rb
# 修正前
n = gets.to_i
a = gets.split.map(&:to_i)
array = Array.new(2 * n + 1, 1)
array[0] = 0
for i in 1..n - 1
array[2 * (i + 1) - 1] += array[a[i] - 1]
array[2 * (i + 1)] += array[a[i] - 1]
end
array.each do |factor|
puts factor
end
c-274.rb
# 修正後
n = gets.to_i
a = gets.split.map(&:to_i)
array = [0, 1, 1]
for i in 1..n - 1
- array[2 * (i + 1) - 1] = array[a[i] - 1] + 1
- array[2 * (i + 1)] = array[a[i] - 1] + 1
+ array[2 * (i + 1)] = array[2 * (i + 1) - 1] = array[a[i] - 1] + 1
end
puts array
解説
何代親を遡るとアメーバ1になるかを記録する大きさ2*n+1の配列を1で初期化します。ここで、アメーバ1は遡る必要がないのでarray[0]=0
としています。後は、順次それぞれのアメーバについて配列の値を更新していくことで実装することができます。