私自身が表題の問題を解いた時のプログラムについて解説します。
問題の詳細は「【誕生日問題11月】ずっしり重い金塊をプレゼント」(CodeIQ)を参照してください。
問題
あなたは誕生日プレゼントとして、金塊をもらえることになりました。
もらえる金塊は、2枚のカードの数字をかけあわせたkgの重さです。
カードには、0を除く10000から-10000の整数が書いてあります。
また、カードは4~10,000枚の偶数枚で、そのうち半分が正の数で、残りが負の数です。
最も重い金塊をゲットできるように2枚のカードを選び、もらえる金塊の重さを計算するプログラムを書いてください。
例
以下、入力の例です。
数字は標準入力から、改行で区切られた文字として渡されます。
5
-10
-8
100
-87
10
以下、出力の例です。最も重い金塊のkgは、上記の場合は、100×10で「1000」です。
答えは、以下のように標準出力に出力してください。
1000
Rubyで解答しています。
#!/usr/bin/ruby # main inputs = [] while line = gets line.strip! if line.empty? then next end inputs << line.to_i end inputs.sort! p [inputs[0]*inputs[1], inputs[-1]*inputs[-2]].max
簡単な問題です。特に悩むようなところはありません。
問題の仕様から小さい方の2個は負数、大きい方の2数は正数であることが保障されるので、入力値をソートして大きい方から2個、小さい方から2個選んで掛け合わせた値を比較して大きい方を印字するだけです。
解説するほどのものではありませんが…。
9行目で入力値を数値にして保持します。
すべての入力値を記録したら、12行目でソートします。
14行目で小さい方の値2個の積と大きい方の値2個の積の大きい方を印字します。
確か、テストケースを通した後にコメントが表示されていて、絶対値をとって計算すれば良いよ、と書かれていたと思います。が、絶対値を取るよりも私のコードのようにした方が楽です。絶対値を取ると入力値の正負を分けて記録しないとダメですが、私のコードのようにすればその必要がありません。