はじめに
Ruby学習の一環として「アルゴリズム実技検定」に挑戦します。
そのための学習の中で学んだことをアウトプットしていきます。
今回は「第一回アルゴリズム実技検定」の三問目(3番目)より。
第一回アルゴリズム実技検定 過去問
自分の解答と、解答する中で学んだ表現・メソッドなどを紹介していきます。
問題
6つの相異なる整数 A, B, C, D, E, Fが与えられる。
このうち 3番目に大きい数を調べるプログラムを作成せよ。
制約
・1≦A,B,C,D,E,F≦100
・A,B,C,D,E,Fは全て異なる
・入力中の値はすべて整数である。
入力は以下の形で与えられる。
A B C D E F
入力例
4 18 25 20 9 13
出力例
=> 13
解答
まずは僕が提出した解答から。
ary = gets.split(" ").map(&:to_i)
r_ary = ary.sort
print r_ary[3]
入力される文字列を整数として配列で受け取り、
sortメソッドを使って並び替え、3番目に大きな整数を出力しています。
ここからは今回初めて使用したsortメソッドについてまとめていきます。
sortメソッド
配列の内容をソート(並び替え)をします。
要素同士の比較は <=> 演算子を使って行い、sort はソートされた配列を生成して返します。
文字列の並び替え
文字列が入った配列に対してソートすると、「a,b,c...」や「あ、い、う…」といった順番に並び替えをしてくれます。
ary1 = [ "d", "a", "e", "c", "b" ]
p ary1.sort
#=> ["a", "b", "c", "d", "e"]
数字が文字列の要素として配列に入っている場合は、以下のような感じ。
ary2 = ["9", "7", "10", "11", "8"]
p ary2.sort
#=> ["10", "11", "7", "8", "9"]
整数の並び替え
初めから整数の要素として配列に入っている場合は、解答のように簡潔に書けますが、
文字列として配列に入っている場合は、ブロック{}を使って以下のようにします。
ary2 = ["9", "7", "10", "11", "8"]
p ary2.sort{|a, b| a.to_i <=> b.to_i }
#=> ["7", "8", "9", "10", "11"]
ただ、ブロックの中で比較を行うためにto_iメソッドを使って整数に変換しているのであって、
生成された配列では文字列に戻っているところに注意したいです。
これと同じことがsort_byメソッドでも行えます。
ary2 = ["9", "7", "10", "11", "8"]
p ary2.sort_by{|a| a.to_i}
#=> ["7", "8", "9", "10", "11"]
最後に
以上、「第一回アルゴリズム実技検定」の三問目(3番目)を解く中で学んだソートについてまとめました。
もし間違いなどございましたら、ご指摘いただけると嬉しいです。