kotazon.com

虎太郎の備忘録

【AtCoder-Ruby】ABC098 B - Cut and Count

問題

問題文

英小文字からなる長さ N の文字列 S が与えられます。
この文字列を一箇所で切断して、文字列 X と Y に分割します。
このとき、「 X と Y のどちらにも含まれている文字」の種類数を最大化したいです。
文字列を切断する位置を適切に決めた際の「 X と Y のどちらにも含まれている文字」の種類数の最大値を求めてください。

制約

  • 2 ≤ N ≤ 100
  • |S| = N
  • S は英小文字からなる

問題リンク

考えたこと

  • 配列を右と左に分けて、片方の配列を uniq しもう片方に含まれる数を数える
  • 分ける位置をずらして、算出した数の最大を取る

とりあえず早く解くことを考えて実装したが、1回目は 20分ほどかかった。(寝起きだからかな。。。)
初めの回答

N = gets.strip.to_i
a = gets.strip.split('')

def chmax(a, b) a > b ? a : b end

def f(x, y)
  res = 0
  x.uniq.each do |c|
    res += 1 if y.include?(c)
  end
  res
end

res = 0
(N - 1).times do |i|
  res = chmax(f(a[0..i], a[i+1..-1]), res)  
end

puts res

その後、再度 1から実装して 5分30秒で実装できた。

回答

N = gets.strip.to_i
a = gets.strip.split('')

def chmax(a, b) a > b ? a : b end

def f(x, y)
  x.uniq.select { |n| y.include?(n) }.size
end

res = 0
(N - 1).times do |i|
  res = chmax(f(a[0..i], a[(i + 1)..-1]), res)
end

puts res

考察

文字の uniq 処理があるので、文字列を配列に変換する処理をはじめに実施している
はじめに実装した時に String のスライス処理で行けると思ったがうまくできなことがわかり、ここでタイムロスが出た。

A、B に関しては概ね解けない問題は無くったと思う。
ただ、C の正解率がまだ低いので、A、B は実装スピードを重視する方向で練習しようと思う。
とりあえず、これはやることにする。

  • 実装の時間を計測する
  • 時間がかかった問題は複数回実装する

理想は A, B 両方で 5分だが、今の実力だと早くて A(2分)、B(10分: 読解5分、実装5分)くらいだろう。
平均で A, B 含めて 15分以内であれば、合格だと思う。