はじめに
Webエンジニアを目指して、RubyやRailsをいじってます。
今回は、RubyでAtCoder ABC301のA, B, Cを解きました。備忘録として解き方をまとめていきたいと思います。
A - Overall Winner
a-301.rb
n = gets.to_i
s = gets.chomp
t = s.count("T")
a = s.count("A")
if t > a
puts "T"
elsif t < a
puts "A"
else
puts s.rindex("T") < s.rindex("A") ? "T" : "A"
end
解説
sに含まれるT, Aの数で場合分けをします。TとAの数が同じである場合には、rindexメソッドを使ってどちらがその数に先に達しているかを判定しています。
B - Fill the Gaps
b-301.rb
n = gets.to_i
a = gets.split.map(&:to_i)
ans = []
a.each_cons(2) do |pre, nxt|
ans << pre
if pre < nxt
(pre + 1).upto(nxt - 1) { |i| ans << i }
else
(pre - 1).downto(nxt + 1) { |i| ans << i }
end
# if文の部分は以下のようにも書ける
# ans.concat pre.step(nxt, by: nxt <=> pre).to_a[1..-2]
end
ans << a[-1]
puts ans.join(" ")
解説
each_consメソッドを使って、隣り合う要素について差が1となるように要素を追加することで実装することができます。
C - AtCoder Cards
c-301.rb
s = gets.chomp.chars.tally
s.default = 0
t = gets.chomp.chars.tally
t.default = 0
array = %w(a t c o d e r)
("a".."z").each do |c|
next if s[c] == t[c]
if s[c] > t[c]
if s[c] <= t[c] + t["@"] && array.include?(c)
t["@"] -= s[c] - t[c]
else
puts "No"
exit
end
else
if t[c] <= s[c] + s["@"] && array.include?(c)
s["@"] -= t[c] - s[c]
else
puts "No"
exit
end
end
end
puts "Yes"
解説
(他の方の提出結果を参考にしました)
tallyメソッドを使って、与えられた文字列それぞれに含まれる英小文字の数を保持する連想配列を生成します。そして、@を使うことでsとtに含まれるatcoder
の文字いずれかの数を合わせることができるかを調べることで実装することができます。