はじめに
Webエンジニアを目指して、RubyやRailsをいじってます。
今回は、RubyでAtCoder ABC243のA, B, Cを解きました。備忘録として解き方をまとめていきたいと思います。
A - Shampoo
a-243.rb
v, a, b, c = gets.split.map(&:to_i)
sum = a + b + c
puts v % sum < a ? "F" : v % sum - a < b ? "M" : "T"
B - Hit and Blow
b-243.rb
gets.to_i
a = gets.split.map(&:to_i)
b = gets.split.map(&:to_i)
index_equal = a.zip(b).count{ _1 == _2 }
puts index_equal
puts (a & b).size - index_equal
解説
A[i] == B[i]
の場合については、zip
メソッドとcount
メソッドを使うことで求めることができます。次に、A, B両方に含まれるが位置が異なる要素の数については、&
を使ってA, B両方に含まれる要素を抽出し、そこから先ほど求めた位置も等しい要素の数を引いたものが答えとなります。
C - Collision 2
c-243.rb
n = gets.to_i
array = Array.new(n){ gets.split.map(&:to_i) }
points = Hash.new{ |h, k| h[k] = [] }
s = gets.chomp.chars
array.zip(s){ |(x, y), c| points[y] << [x, c] }
points.values.each do
next if _1.size < 2
_1.sort.each_cons(2) do |(_, l), (_, r)|
if l == "R" && r == "L"
puts "Yes"
exit
end
end
end
puts "No"
解説
連想配列を使って、y座標が同じものでグループ分けします。そして、それぞれについてvalue
が2つ以上であれば、衝突するものがあるかどうかを調べることにより答えを求めることができます。