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

今日もAtCoderの問題です。

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

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

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

[code]
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
[/code]

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

[code]
str1 = @s[var,@k]
[/code]

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

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

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

以上。

カテゴリー: Ruby