[初学者/At_Corder] A.Range Productを解いてみた
目次
- 概要
- 開発環境
- 解答と説明
- まとめ
概要
A.Range Productの問題です。
開発環境
- Ruby 2.6.3
- Visual Studio Code
- Ubuntu 20.04.3
解答と説明
問題文は下記のサイトにて、ご覧いただけます。
解答
range_product.rb
a,b = gets.split.map(&:to_i)
if a <= 0 && 0 <= b
puts "Zero"
elsif b < 0
num = b-a+1
if num.even?
puts "Positive"
else
puts "Negative"
end
else
puts "Positive"
end
説明
<流れ>
※問題文のまま、連続数の配列を作ってから、inject(:*)にて、すべてをかけあわせる処理だと、配列の長さに応じて、実行時間が長くなってしまうため、下記のような条件にて分岐。
- 入力された値をa,bに代入。
↓ - (if)入力値の範囲に0が含まれた場合、Zeroを出力。
理由:0に何の数字をかけても、答えは0になるため。
↓ - (elsif)入力値の範囲すべてがマイナスの場合、数字の個数が偶数の時は、Positiveを出力。奇数の時は、Negativeを出力。
理由;(-1)×(-2)=2、(-1)×(-2)×(-3)=(-6) のように、マイナスの数字の個数が偶数の時は、マイナスを打ち消し、奇数の時は、マイナスが残るため。
↓ - (else)入力値の範囲すべてがプラスの場合、Positiveを出力。
理由:マイナスの数字が含まれず、0が含まれない場合は、答えはすべてプラスの数字になるため。
上記流れをコメントとして、実際のコードに付け加えると下記のようになります。
説明コメント付き
# 入力された値をa,bに代入。
a,b = gets.split.map(&:to_i)
# (if)入力値の範囲に0が含まれた場合、Zeroを出力。
if a <= 0 && 0 <= b
puts "Zero"
# (elsif)入力値の範囲すべてがマイナスの場合、数字の個数が偶数の時は、Positiveを出力。
# 奇数の時は、Negativeを出力。
elsif b < 0
# b-a+1とすると、マイナス範囲の数字の個数が取得できる。(今回は、a<bでaの方が小さいため、b-a+1)
# => (-1)-(-3)+1 => (-1)+3+1 = 3個
num = b-a+1
if num.even?
puts "Positive"
else
puts "Negative"
end
# (else)入力値の範囲すべてがプラスの場合、Positiveを出力。
else
puts "Positive"
end
<メソッド説明>
- 入力された値の取得
空白区切りの取得に、splitを用い、
すべてIntegerで取得するために、a,b,cそれぞれに、to_iをmapメソッドにて、処理しています。
入力された値の取得
# a,b = とすると、一度に代入できます。
a,b = gets.split.map(&:to_i)
- 偶数の判定
even?メソッドを用いて、b-a+1が偶数であるかを判定しています。
偶数の判定
num.even?
まとめ
ざっくりと解答をまとめてみました。
より良いコードになるよう、アドバイスいただけると、嬉しいです!