はじめに
Webエンジニアを目指して、RubyやRailsをいじってます。
今回は、RubyでAtCoder ABC278のA, B, C, Dを解きました。備忘録として解き方をまとめていきたいと思います。
A - Shift
a-278.rb
n, k = gets.split.map(&:to_i)
a = gets.split.map(&:to_i)
puts n <= k ? ([0] * n).join(" ") : (a[k,n] + [0] * k).join(" ")
解説
問題文を言い換えると、「先頭からK個要素を取り除き、後ろに0をK個追加する」となります。なお、N<=Kの場合はN個の0を要素としてもつ配列が答えとなります。
B - Misjudge the Time
b-278.rb
h, m = gets.split.map(&:to_i)
loop do
a, b = h / 10, h % 10
c, d = m / 10, m % 10
if a * 10 + c < 24 && b * 10 + d < 60
puts "#{h} #{m}"
exit
end
m += 1
if m == 60
m = 0
h += 1
end
if h == 24
h = 0
end
end
解説
問題文の通りに実装すればOKです。なお、時間は24になったら0でリセット、分は60になったら0にリセットして時間をインクリメントする必要があります。
C - FF
c-278.rb
n, q = gets.split.map(&:to_i)
hash = {}
q.times do
t, a, b = gets.split.map(&:to_i)
case t
when 1
hash[[a,b]] = true
when 2
hash[[a,b]] = false
when 3
puts hash[[a, b]] && hash[[b, a]] ? "Yes" : "No"
end
end
他の方の提出結果を見てみたところ、以下のような方法もあるようでこちらの方が高速です。
別解
n, q = gets.split.map(&:to_i)
hash = {}
q.times do
t, a, b = gets.split.map(&:to_i)
case t
when 1
hash[a] ||= {}
hash[a][b] = true
when 2
hash[a][b] = false if hash[a]
when 3
puts hash[a] && hash[a][b] && hash[b] && hash[b][a] ? "Yes" : "No"
end
end
解説
連想配列を使って問題文の通りに実装することで十分間に合います。
メモ
・||=
:偽か未定義なら代入
D - All Assign Point Add
d-278.rb
gets
a = gets.split.map(&:to_i)
q = gets.to_i
hash = {}
a.each.with_index { |factor, i| hash[i + 1] = factor }
q.times do
t, a, b = gets.split.map(&:to_i)
case t
when 1
hash = Hash.new(a)
when 2
hash[a] += b
when 3
puts hash[a]
end
end
解説
t=1のときの要素をすべてaに変えるという操作は、Hash.new(a)
を使うことで実装することができます。
終わりに
クエリを使う問題は結構好きですね。