はじめに
Webエンジニアを目指して、RubyやRailsをいじってます。
今回は、RubyでAtCoder ABC247のA, B, C, Dを解きました。備忘録として解き方をまとめていきたいと思います。
A - Move Right
a-247.rb
puts "0" + gets.chomp[0..2]
B - Unique Nicknames
b-247.rb
n = gets.to_i
array = Array.new(n){ gets.split }
hash = array.flatten.tally
array.each do |s, t|
if s != t && hash[s] != 1 && hash[t] != 1
puts "No"
exit
end
end
puts "Yes"
解説
flatten
メソッドとtally
メソッドを使ってそれぞれの名前が何回現れたかを連想配列hashにもたせます。そして、問題文にある条件を満たしているかどうかを判定することで解くことができます。
C - 1 2 1 3 1 2 1
c-247.rb
n = gets.to_i
ans = "1"
2.upto(n){ |i| ans = "#{ans} #{i} #{ans}" }
puts ans
解説
Nが16以下と小さいので、"1"
で初期化したans
を順番に更新していけば答えが求まります。
D - Cylinder
d-247.rb
q = gets.to_i
que = []
q.times do
t, x, c = gets.split.map(&:to_i)
case t
when 1
que << [x, c]
when 2
ans = 0
while x > 0
s, t = que.shift
remove_count = [t, x].min
ans += s * remove_count
x -= remove_count
t -= remove_count
que.unshift([s, t]) if t > 0
end
puts ans
end
end
解説
(他の方の提出結果を参考にしました)
1)1のとき
xと書かれたボールをc個右側に入れるので、配列queの末尾に[x, c]
を追加します。
2)2のとき
取り出したボールの数がxとなるまで、取り出したボールに書かれていた数字の総和を求めます。