🧐

並び替え sort_by

2024/05/22に公開

問題

N 人の人々がおり、それぞれの人は金と銀を何キログラムか持っています。今は金の方が銀よりも価値が高いですが、ある日金と銀の価値が逆転して、人々の財産の多さは次のように決定されるようになりました。

  1. 持っている銀が多い方が財産が多い。
  2. 持っている銀が同じなら、持っている金が多い方が財産が多い。

それぞれの人が持っている金と銀のキログラム数が与えられるので、この規則にしたがって、財産を多い順に並び替えて出力してください。

入力される値
N
g_1 s_1
...
g_N s_N
入力例
4
2 3
0 4
5 0
3 3
出力例
0 4
3 3
2 3
5 0

回答例

n = gets.to_i
pairs = Array.new(n)

n.times { |i| pairs[i] = gets.split.map(&:to_i) }

sorted_pairs = pairs.sort_by { |g, s| [-s, -g] }

sorted_pairs.each do |pair|
  puts pair.join(" ")
end

ポイント

sort_by メソッドはデフォルトでキーを昇順(小さい順)に並び替えます。
[-s, -g] のようにマイナスをつけることによって、結果的にs、gの大きい順(降順)に並び替えできます。

元の配列:[[2, 3], [0, 4], [5, 0], [3, 3]]
に対して [-s, -g] を評価すると、

[2, 3] -> [-3, -2]
[0, 4] -> [-4, 0]
[5, 0] -> [0, -5]
[3, 3] -> [-3, -3]

となります。

これをsort_by メソッドで並び替えると、

[-4, 0] -> [0, 4]
[-3, -2] -> [2, 3]
[-3, -3] -> [3, 3]
[0, -5] -> [5, 0]

となります。

Discussion