はじめに
Webエンジニアを目指して、RubyやRailsをいじってます。
今回は、RubyでAtCoder ABC270のA, B, Cを解きました。備忘録として解き方をまとめていきたいと思います。
A - 1-2-4 Test
a-270.rb
a, b = gets.split.map(&:to_i)
puts a | b
解説
どちらか一方が解いていればいいので、bit演算子のORを使うことで実装することができます。
B - Hammer
b-270.rb
x, y, z = gets.split.map(&:to_i)
x, y, z = -x, -y, -z if y < 0
if x < y
puts x.abs
else
if y < z
puts -1
else
puts z.abs + (x - z).abs
end
end
解説
(公式解説を参考にしました)
yを正に揃えることで、場合分けの数を減らしています。
C - Simple path
c-270.rb
n, x, y = gets.split.map(&:to_i)
array = Array.new(n + 1) { [] }
(n - 1).times do
u, v = gets.split.map(&:to_i)
array[u] << v
array[v] << u
end
searched = Array.new(n + 1, false)
searched[x] = true
stack = [x]
parent = Array.new(n + 1, 0)
while node = stack.pop
array[node].each do |i|
next if searched[i]
searched[i] = true
stack << i
parent[i] = node
end
end
ans = [y]
while ans[-1] != x
ans << parent[ans[-1]]
end
puts ans.reverse.join(" ")
解説
DFSで深さ優先探索しています。最後にyを親、xを子としてyからxに辿り着けるまでans配列に要素を格納していきます。
終わりに
B問題は自力で解いたのだと
x, y, z = gets.split.map(&:to_i)
if x == 0
p 0
elsif x > 0
if x < y || y < 0
p x
else
if y < z
p -1
else
if z < 0
p 2 * z.abs + x
else
p x
end
end
end
else
if x > y || y > 0
p x.abs
else
if z < y
p -1
else
if z > 0
p 2 * z.abs + x.abs
else
p x.abs
end
end
end
end
こんな感じですごく長くなってしまいました。yを正に揃えるいうことを思いつけなかったのが悔しいです...