1
0

More than 1 year has passed since last update.

[初学者/At_Corder] A.Range Productを解いてみた

Posted at

[初学者/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?

まとめ

ざっくりと解答をまとめてみました。
より良いコードになるよう、アドバイスいただけると、嬉しいです!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0