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

いつものatcoderシリーズです。
最近Bも解けるようになってきたので、Bも挑戦するようにしています。
Bでは比較的配列操作などすると、スムーズに解けるイメージがついてきたので、もう少し頑張ってCまでいけたらなぁという所感です。

ということでまずAの問題はこちら。
[blogcard url=http://abc031.contest.atcoder.jp/tasks/abc031_a]

そして、書いたコードがこちら。
[code]
class ABC031a
def inputnum
@A, @D = STDIN.gets.split(/ /).map { | var | var.to_i }
end
def display
self.inputnum
if @A.between?(1,200) && @D.between?(1,200)
@Aup = (@A + 1) * @D
@Dup = (@D + 1) * @A
end
if @Aup > @Dup
p @Aup
else
p @Dup
end
end
end

x = ABC031a.new
x.display
[/code]

この問題で良かったのが、上記コードについては特に大きく悩むことなく一発で書けて、atcoderでも100点を取れたことです。
splitでスペース区切りで変数に入れるところや、betweenで範囲を指定するメソッドなど、過去に何度も使用してきているので書くことへの抵抗が減っているのは大きいなと感じます。

そして、B問題はこちら。
[blogcard url=http://abc031.contest.atcoder.jp/tasks/abc031_b]

私が書いたコードはこちら。
[code]
class ABC031b
def setvar
array = Array[]
array = STDIN.read.split(?\n)
@L, @H = array[0].split(‘ ‘).map { | v | v.to_i }
@N = array[1]
@A = array
end
def check
num = @A.count – 1
(2..num).each do | var |
var2 = @A[var].to_i
if var2 > @H
puts ‘-1’
elsif var2 < @L
puts @L – var2
else
puts ‘0’
end
end
end
end

x = ABC031b.new
x.setvar
x.check
[/code]

ここでは、横と縦でどうやって変数にいれるか?ということに悩みました。
そして、考えた結果、一旦配列に入れて、配列から順番に取り出して処理をしていくことにしました。

@Lと@Hは横に数字が並んでいるので、要素0(1つ目)を取り出して、splitでいつものように分解して変数に代入します。
その後は、要素の数だけ、eachで回しながらif文で処理するという流れです。
比較的シンプルな考え方であるのは良いのですが、いまだにこれをClassで書くメリットというか、結局順番処理になってしまっているというモヤモヤがあります。
この辺はしっかりとClassについての理解が追いついていないのだと思うので、書籍などでもう一度勉強していきたいです。

以上。

カテゴリー: ProgramRubyTech