【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分以内であれば、合格だと思う。