はじめに
Webエンジニアを目指して、RubyやRailsをいじってます。
今回は、RubyでAtCoder ABC273のA, B, Cを解きました。備忘録として解き方をまとめていきたいと思います。
A - A Recursive Function
a-273.rb
def f(k)
- f = 1
- f = k * f(k - 1) if k != 0
- f
+ (1..k).inject(1, :*)
end
n = gets.to_i
puts f(n)
解説
再帰関数を定義することで実装することができます。
B - Broken Rounding
b-273.rb
# 修正前
x, k = gets.split.map(&:to_i)
k.times do |i|
x = x.round(-i - 1)
end
puts x
b-273.rb
# 修正後
x, k = gets.split.map(&:to_i)
puts k.times.inject(x){ |result, i| result.round(-i - 1) }
解説
i(0<=i<=k-1)について順次四捨五入していくことで実装することができます。
C - (K+1)-th Largest Number
c-273.rb
n = gets.to_i
a = gets.split.map(&:to_i)
b = a.sort.uniq
l = b.size
hash = Hash.new(0)
n.times do |i|
index = b.bsearch_index { |x| x > a[i] } || l
hash[l - index] += 1
end
n.times do |k|
puts hash[k]
end
他の方の提出結果を参考にしたところtallyメソッドを使って解くこともできるようです。こちらの方が高速で直感的に分かりやすいです。
別解
n = gets.to_i
a = gets.split.map(&:to_i)
hash = {}
l = a.uniq.size
- a.sort.uniq.each_with_index do |factor, index|
+ a.uniq.sort.each_with_index do |factor, index|
hash[l - 1 - index] = factor
end
a = a.tally
n.times do |k|
puts a[hash[k]] || 0
end
解説
最初のコードでは、bsearch_indexメソッドを使ってa[i]よりも大きくなるインデックスを取得し連想配列を更新しています。