はじめに
Webエンジニアを目指して、RubyやRailsをいじってます。
今回は、RubyでAtCoder ABC237のA, B, C, Dを解きました。備忘録として解き方をまとめていきたいと思います。
A - Not Overflow
a-237.rb
n = gets.to_i
puts (-2) ** 31 <= n && n < 2 ** 31 ? "Yes" : "No"
B - Matrix Transposition
b-237.rb
h, _ = gets.split.map(&:to_i)
array = Array.new(h){ gets.split.map(&:to_i) }.transpose
array.each do
puts _1.join(" ")
end
C - kasaka
c-237.rb
def counter_of_a(s, count = 0)
while s[count] == "a"
count += 1
end
return count
end
s = gets.chomp
left = counter_of_a(s)
right = counter_of_a(s.reverse)
s = "a" * [right - left, 0].max + s
puts s == s.reverse ? "Yes" : "No"
解説
最初に、左側から何個aが連続してあるか、右側から何個aが連続してあるかを求めておきます。そして、先頭にaをその差分の個数だけ加えた後のsが回文となっているかどうかを判定することで解くことができます。
D - LR insertion
d-237.rb
n = gets.to_i
s = gets.chomp.chars
ans = [n]
(n - 1).downto(0) do
if s[_1] == "L"
ans.push(_1)
else
ans.unshift(_1)
end
end
puts ans
解説
末尾から考えることで答えが求まります。
具体的には、入力例1の場合、[5](R)->[4,5](L)->[4,5,3](R)->[2,4,5,3](R)->[1,2,4,5,3](L)->[1,2,4,5,3,0]
のように対応する値をRのときは先頭に追加し、Lのときは末尾に追加すれば良いことがわかります。