高橋くんとパスワードを解いた

こんにちは、いなむーです。

今日もAtCoderの問題です。

「これなら解けそう」って思ったら、解きたくてしょうがなくなるので、atcoder中毒になってますね笑
勉強にはなりました。

では、さっそく。
問題はこちら。リンク先をご参照ください。
[blogcard url=http://abc032.contest.atcoder.jp/tasks/abc032_b]

そして書いたコードがこちら。

class ABC032b
  def inputnum
    s, k = STDIN.read.split(?\n)
    @s = s.to_s
    @k = k.to_i
  end 
 
  def setarr
    snum = 0 
    slength = @s.length
    snum2 = snum.to_i
 
    @array = Array[]
 
    (snum..slength).each { | var | 
      str1 = @s[var,@k]
      @array << str1 if str1.size >= @k
    }   
  end 
 
  def displaynum
    p @array.sort.uniq.count
  end 
end
 
x = ABC032b.new
x.inputnum
x.setarr
x.displaynum

これだとClassにする意味が無いかもしれませんが、とりあえずはこれで100点が取れたので、残しておきます。
考えた方としては、
inputnumで標準入力を変数へ代入して、明示的に文字列と数値にしてます。
そして、setarrで配列をeachで回して処理しています。
ここで勉強になったのが、Stringクラスです。

str1 = @s[var,@k]

@sの文字列var番目から、@kまでを抽出するという意味となり、今回はvarを可変させることで、@s文字列から全ての@k文字分の文字列を抽出してます。
また、値が@k以上のサイズだったら、配列に追加するようにしました。
これは、@k以上というよりは、@kよりも小さい値か空の文字列の場合に配列に入れないようにしたかったため、そうしました。

そして最後にメソッドの連発。
@array配列の中身をソート(sort)して、uniqで重複排除して、残った配列の数をcountで出しております。

Aよりは難しく、ただ、理解するとそこまで難しい内容ではなかったので他でも解けそうなB問題があったら解いていきたいです。

以上。