はじめに
Webエンジニアを目指して、RubyやRailsをいじってます。
今回は、RubyでAtCoder ABC283のA, B, C, Dを解きました。備忘録として解き方をまとめていきたいと思います。
A - Power
a, b = gets.split.map(&:to_i)
puts a ** b
B - First Query Problem
gets
a = gets.split.map(&:to_i)
q = gets.to_i
q.times do
t, k, x = gets.split.map(&:to_i)
case t
when 1
a[k - 1] = x
when 2
puts a[k - 1]
end
end
解説
問題文の通りに実装すればOKです。
C - Cash Register
s = gets.chomp
n = s.size
s = s.split("00").join
m = (n-s.size) / 2
puts s.size + m
解説
<方針と実装方法>
例えば、s=16000020であったとします。このとき、操作としては1->16->1600->160000->1600002->16000020のように計6回の操作が必要となります。
ここで、00を押したとき100倍とする操作は他のボタンと異なる操作なのでこれで切り分けることを考えます。splitメソッドを使って、切り分けると16000020は1620となります((もとのsの大きさ-切り分けた後のsの大きさ)/2=00を押した数)。また、切り分けた後のs大きさは00以外のボタンを押す回数と一致します。以上のことから、これらの数を足した値が答えとなります。
D - Scope
s = gets.chomp.chars
arr = []
hash = {}
s.each do|i|
case i
when "("
arr << i
when ")"
until arr[-1] == "("
a = arr.pop
hash[a] = false
end
arr.pop
else
if hash[i]
puts "No"
exit
end
hash[i] = true
arr << i
end
end
puts "Yes"
解説
(他の方の提出結果を参考にしました)
与えられた文字列の要素それぞれに対して以下の操作を行うことで実装することができます。
1."("のとき
arrayに格納します。
2.")"のとき
arrayの末尾が"("となるまで要素を取り除き、連想配列hashにおけるそのkeyに対応するvalueをtrueにします。
3.小文字のとき
文字が箱(hash)に入っていればNoを出力して終了し、入っていなければtrueにしてarrayに格納します。最後まで、探索できればYesを出力します。
終わりに
D問題が解けませんでした...
また、C問題は実装に工夫が必要で苦手な系統の問題でした。めげずに頑張っていきましょう!