はじめに
Webエンジニアを目指して、RubyやRailsをいじってます。
今回は、RubyでAtCoder ABC303のA, B, Cを解きました。備忘録として解き方をまとめていきたいと思います。
A - Similar String
a-303.rb
gets
s = gets.tr("01", "ol")
t = gets.tr("01", "ol")
puts s == t ? "Yes" : "No"
解説
trメソッドを使って、0をoに、1をlに置換した後のsとtが一致しているかどうかを判定すればOKです。
B - Discord
b-303.rb
n, m = gets.split.map(&:to_i)
- sum_pair = Array.new(m){ gets.split.each_cons(2).map{ |pair| pair.sort! } }.flatten.each_slice(2).uniq.size
+ sum_pair = Array.new(m){ gets.split.each_cons(2).map(&:sort!) }.flatten(1).uniq.size
- puts [*1..n].combination(2).size - sum_pair
+ puts (n * (n - 1)) / 2 - sum_pair
解説
each_cons
メソッドとflatten
メソッドおよびeach_slice
メソッドを組み合わせることで、隣り合った人の組み合わせを求めることができます。このとき求める答えは、(1..n)から2つ選んでできる組み合わせの数から先ほどの隣り合ったことのある人の組み合わせの数を差し引いた値となります。
C - Dash
c-303.rb
n, m , h , k = gets.split.map(&:to_i)
s = gets.chomp.chars
hash = {}
m.times do
x, y = gets.split.map(&:to_i)
hash[[x, y]] = true
end
nx = ny = 0
s.each do |c|
h -= 1
break if h < 0
case c
when "R"
nx += 1
when "L"
nx -= 1
when "U"
ny += 1
when "D"
ny -= 1
end
if h < k && hash[[nx, ny]]
hash[[nx, ny]] = false
h = k
end
end
puts h >= 0 ? "Yes" : "No"
解説
連想配列を使って、問題文の通りに実装することで高橋くんが倒れることなくN回の移動ができるかどうかを判定することができます。