0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

RubyでAtCoder ABC290(A, B, C)を解いてみた

Last updated at Posted at 2023-04-04

はじめに

Webエンジニアを目指して、RubyやRailsをいじってます。
今回は、RubyでAtCoder ABC290のA, B, Cを解きました。備忘録として解き方をまとめていきたいと思います。

A - Contest Result

a-290.rb
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

b-290.rb
# 修正前
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")
b-290.rb
# 修正後
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"となる部分を連結しています。

別解1
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)
別解2
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

c-290.rb
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を解いていきたいと思います。

0
0
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?