はじめに
Webエンジニアを目指して、RubyやRailsをいじってます。
今回は、RubyでAtCoder ABC290のA, B, Cを解きました。備忘録として解き方をまとめていきたいと思います。
A - Contest Result
n, m = gets.split(" ")
a = gets.split.map(&:to_i)
b = gets.split.map(&:to_i)
- ans = 0
- b.each{|i| ans += a[i - 1]}
- puts ans
# 修正1
- puts b.sum{|i| i = a[i - 1]}
# 修正2
+ puts b.sum{|i| a[i - 1]}
解説
N, Mともに100以下と小さいので、問題文の通りに実装すれば十分間に合います。
B - Qual B
# 修正前
n, k = gets.split.map(&:to_i)
s = gets.chomp.chars
array = Array.new(n, false)
count = 0
s.each_with_index do|factor, index|
if factor == "o"
array[index] = "o"
count += 1
break if count == k
end
end
puts array.join.gsub(/false/, "x")
# 修正後
n, k = gets.split.map(&:to_i)
s = gets.chomp.chars
ans = "x" * n
count = 0
s.each_with_index do|factor, index|
if factor == "o"
ans[index] = "o"
count += 1
break if count == k
end
end
puts ans
<追記>
コメントでいただいた別解になります。順にindexを更新していき最後に"x"となる部分を連結しています。
n, k = gets.split.map(&:to_i)
str = gets.chomp
index = 0
k.times do
index = str.index("o", index) + 1
end
puts str[0, index] + "x" * (str.length - index)
n, k = gets.split.map(&:to_i)
s = gets.chomp
i = 1
puts s.each_char.map {|c|
if c == "o" && i <= k
i += 1
"o"
else
"x"
end
}.join
解説
まず、N個のx
からなる文字列を用意します。そして、参加を希望する人数がKに達するまで先頭から順に調べていき、参加を希望する場合はそこに対応する要素をo
に置き換えています。最後に、最終的な結果を出力すればOKです。
メモ
・indexの第2引数:第2引数の値のindexから調べることができる。
C - Max MEX
n, k = gets.split.map(&:to_i)
a = gets.split.map(&:to_i).uniq.sort[0..k - 1]
# [0..k-1]の部分は、[0...k][0,k]でも可能です。
- if a[0] != 0
- puts 0
- exit
- end
+ a.unshift(-1)
a.each_cons(2).each do|i, j|
if j != i + 1
puts i + 1
exit
end
end
puts a[-1] + 1
解説
まず、与えられた配列の重複を取り除きソートした後、先頭からK個取り出しています。また、先頭が0でない場合は答えは0となるので、aの先頭に-1を入れることでコードをまとめています。そして、each_consメソッドを使って隣り合う要素が条件を満たすかどうか判定を行うことで答えが求まります。
余談
昨日教えていただいたeach_consメソッドが早速使えました!
終わりに
今回の問題は、比較的簡単であったように感じました。また、コメントで教えていただいたメソッドのおかげでスムーズに実装することができました!
次回は、AtCoder ABC289を解いていきたいと思います。