はじめに
Webエンジニアを目指して、RubyやRailsをいじってます。
今回は、RubyでAtCoder ABC249のA, B, Cを解きました。備忘録として解き方をまとめていきたいと思います。
A - Jogging
a-249.rb
def f(a, b, c, x)
return b * (a * (x / (a + c)) + [a, x % (a + c)].min)
end
a, b, c, d, e, f, x = gets.split.map(&:to_i)
d_takahashi = f(a, b, c, x)
d_aoki = f(d, e, f, x)
puts d_takahashi > d_aoki ? "Takahashi" : d_takahashi < d_aoki ? "Aoki" : "Draw"
B - Perfect String
b-249.rb
s = gets.chomp
puts s != s.upcase && s != s.downcase && s.chars == s.chars.uniq ? "Yes" : "No"
解説
条件を言い換えると、sが英大文字または英小文字からなることから、「小文字が含まれない」は「すべて大文字」、「大文字が含まれない」は「すべて小文字」となります。これは、upcase
メソッドとdowncase
メソッドを使って判定することができます。また、すべての文字が相異なるかどうかはuniq
メソッドを使って判定することができます。
C - Just K
c-249.rb
n, k = gets.split.map(&:to_i)
array = Array.new(n){ gets.chomp.chars }
ans = 0
1.upto(n) do |i|
array.combination(i) do |selected_str|
hash = selected_str.flatten.tally
ans = [ans, hash.values.count(k)].max
end
end
puts ans
解説
combination
メソッドを使ってそれぞれの場合に対して探索します。また、含まれるそれぞれの文字の数はtally
メソッドを使って算出しています。そして、count
メソッドを使ってK個となる文字は何種類あるか数え上げ、最大値を更新していくことで本問題は解くことができます。